annotate Sources/Plugin.cpp @ 2:2bdb9acb7dcf

added STL viewer button at instance level too
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 18 Jul 2023 09:41:31 +0200
parents 0f03a8a0bd6f
children 0fb06c6a6c87
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * SPDX-FileCopyrightText: 2023 Sebastien Jodogne, UCLouvain, Belgium
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * SPDX-License-Identifier: GPL-3.0-or-later
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 */
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 /**
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * STL plugin for Orthanc
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * Copyright (C) 2023 Sebastien Jodogne, UCLouvain, Belgium
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 *
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * This program is free software: you can redistribute it and/or
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * modify it under the terms of the GNU General Public License as
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * published by the Free Software Foundation, either version 3 of the
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * License, or (at your option) any later version.
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 *
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * This program is distributed in the hope that it will be useful, but
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * General Public License for more details.
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 *
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * You should have received a copy of the GNU General Public License
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 **/
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 #include "../Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h"
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
27 #include <ChunkedBuffer.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
28 #include <DicomParsing/ParsedDicomFile.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
29 #include <Images/ImageProcessing.h>
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 #include <Logging.h>
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
31 #include <OrthancFramework.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
32 #include <SerializationToolbox.h>
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 #include <SystemToolbox.h>
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 #include <EmbeddedResources.h>
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
37 #include <vtkImageData.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
38 #include <vtkImageResize.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
39 #include <vtkMarchingCubes.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
40 #include <vtkNew.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
41 #include <vtkPolyData.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
42 #include <vtkTriangle.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
43 #include <vtkSmoothPolyDataFilter.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
44 #include <vtkPolyDataNormals.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
45 #include <vtkImageConstantPad.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
46
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 #include <boost/thread/shared_mutex.hpp>
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 // Forward declaration
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 void ReadStaticAsset(std::string& target,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 const std::string& path);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 /**
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 * As the Three.js static assets are gzipped by the
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 * "EmbedStaticAssets.py" script, we use a cache to maintain the
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 * uncompressed assets in order to avoid multiple gzip decodings.
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 **/
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 class ResourcesCache : public boost::noncopyable
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 private:
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 typedef std::map<std::string, std::string*> Content;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 boost::shared_mutex mutex_;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 Content content_;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 public:
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 ~ResourcesCache()
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 for (Content::iterator it = content_.begin(); it != content_.end(); ++it)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 assert(it->second != NULL);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 delete it->second;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 void Answer(OrthancPluginRestOutput* output,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 const std::string& path)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 const std::string mime = Orthanc::EnumerationToString(Orthanc::SystemToolbox::AutodetectMimeType(path));
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 // Check whether the cache already contains the resource
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 boost::shared_lock<boost::shared_mutex> lock(mutex_);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 Content::const_iterator found = content_.find(path);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 if (found != content_.end())
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 assert(found->second != NULL);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, found->second->c_str(), found->second->size(), mime.c_str());
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 return;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 // This resource has not been cached yet
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 std::unique_ptr<std::string> item(new std::string);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 ReadStaticAsset(*item, path);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, item->c_str(), item->size(), mime.c_str());
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 // Store the resource into the cache
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 boost::unique_lock<boost::shared_mutex> lock(mutex_);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 if (content_.find(path) == content_.end())
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 content_[path] = item.release();
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 };
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 static ResourcesCache cache_;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 static bool hasCreateDicomStl_;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 void ServeFile(OrthancPluginRestOutput* output,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119 const char* url,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 const OrthancPluginHttpRequest* request)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122 std::string file = request->groups[0];
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 if (file == "viewer.html")
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 std::string s;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 Orthanc::EmbeddedResources::GetFileResource(s, Orthanc::EmbeddedResources::VIEWER_HTML);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, s.c_str(), s.size(), Orthanc::EnumerationToString(Orthanc::MimeType_Html));
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130 else if (file == "viewer.js")
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 std::string s;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133 Orthanc::EmbeddedResources::GetFileResource(s, Orthanc::EmbeddedResources::VIEWER_JS);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, s.c_str(), s.size(), Orthanc::EnumerationToString(Orthanc::MimeType_JavaScript));
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 else
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 cache_.Answer(output, file);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
143
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
144
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
145 #include <dcmtk/dcmdata/dcdeftag.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
146 #include <dcmtk/dcmdata/dcfilefo.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
147 #include <dcmtk/dcmdata/dcitem.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
148 #include <dcmtk/dcmdata/dcsequen.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
149
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
150 class Extent2D : public boost::noncopyable
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
151 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
152 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
153 bool isEmpty_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
154 double x1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
155 double y1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
156 double x2_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
157 double y2_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
158
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
159 void CheckNotEmpty() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
160 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
161 if (isEmpty_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
162 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
163 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
164 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
165 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
166
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
167 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
168 Extent2D() :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
169 isEmpty_(true),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
170 x1_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
171 y1_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
172 x2_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
173 y2_(0)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
174 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
175 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
176
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
177 bool IsEmpty() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
178 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
179 return isEmpty_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
180 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
181
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
182 double GetMinX() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
183 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
184 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
185 return x1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
186 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
187
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
188 double GetMaxX() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
189 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
190 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
191 return x2_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
192 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
193
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
194 double GetMinY() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
195 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
196 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
197 return y1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
198 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
199
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
200 double GetMaxY() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
201 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
202 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
203 return y2_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
204 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
205
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
206 double GetWidth() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
207 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
208 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
209 return x2_ - x1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
210 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
211
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
212 double GetHeight() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
213 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
214 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
215 return y2_ - y1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
216 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
217
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
218 void Add(double x,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
219 double y)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
220 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
221 if (isEmpty_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
222 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
223 x1_ = x2_ = x;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
224 y1_ = y2_ = y;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
225 isEmpty_ = false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
226 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
227 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
228 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
229 x1_ = std::min(x1_, x);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
230 x2_ = std::max(x2_, x);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
231 y1_ = std::min(y1_, y);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
232 y2_ = std::max(y2_, y);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
233 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
234 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
235 };
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
236
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
237 static void GetStringValue(std::string& value,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
238 DcmItem& item,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
239 const DcmTagKey& key)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
240 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
241 const char* s = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
242 if (!item.findAndGetString(key, s).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
243 s == NULL)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
244 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
245 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
246 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
247 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
248 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
249 value.assign(s);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
250 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
251 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
252
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
253
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
254 static void ListStructuresNames(std::set<std::string>& target,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
255 Orthanc::ParsedDicomFile& source)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
256 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
257 target.clear();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
258
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
259 DcmSequenceOfItems* sequence = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
260 if (!source.GetDcmtkObject().getDataset()->findAndGetSequence(DCM_StructureSetROISequence, sequence).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
261 sequence == NULL)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
262 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
263 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
264 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
265
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
266 for (unsigned long i = 0; i < sequence->card(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
267 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
268 DcmItem* item = sequence->getItem(i);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
269 if (item == NULL)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
270 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
271 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
272 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
273 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
274 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
275 std::string value;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
276 GetStringValue(value, *item, DCM_ROIName);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
277 target.insert(value);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
278 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
279 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
280 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
281
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
282
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
283 static bool IsNear(double a,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
284 double b)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
285 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
286 return std::abs(a - b) < 10.0 * std::numeric_limits<double>::epsilon();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
287 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
288
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
289
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
290 class Vector3D
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
291 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
292 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
293 double x_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
294 double y_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
295 double z_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
296
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
297 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
298 Vector3D() :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
299 x_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
300 y_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
301 z_(0)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
302 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
303 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
304
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
305 Vector3D(double x,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
306 double y,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
307 double z) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
308 x_(x),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
309 y_(y),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
310 z_(z)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
311 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
312 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
313
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
314 Vector3D(const Vector3D& from,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
315 const Vector3D& to) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
316 x_(to.x_ - from.x_),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
317 y_(to.y_ - from.y_),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
318 z_(to.z_ - from.z_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
319 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
320 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
321
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
322 double GetX() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
323 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
324 return x_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
325 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
326
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
327 double GetY() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
328 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
329 return y_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
330 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
331
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
332 double GetZ() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
333 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
334 return z_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
335 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
336
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
337 double ComputeNorm() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
338 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
339 return sqrt(x_ * x_ + y_ * y_ + z_ * z_);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
340 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
341
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
342 void Normalize()
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
343 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
344 double norm = ComputeNorm();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
345 if (!IsNear(norm, 0))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
346 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
347 x_ /= norm;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
348 y_ /= norm;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
349 z_ /= norm;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
350 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
351 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
352
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
353 static Vector3D CrossProduct(const Vector3D& u,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
354 const Vector3D& v)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
355 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
356 return Vector3D(u.GetY() * v.GetZ() - u.GetZ() * v.GetY(),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
357 u.GetZ() * v.GetX() - u.GetX() * v.GetZ(),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
358 u.GetX() * v.GetY() - u.GetY() * v.GetX());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
359 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
360
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
361 static double DotProduct(const Vector3D& a,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
362 const Vector3D& b)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
363 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
364 return a.GetX() * b.GetX() + a.GetY() * b.GetY() + a.GetZ() * b.GetZ();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
365 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
366 };
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
367
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
368
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
369
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
370 static bool MyParseDouble(double& value,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
371 const std::string& s)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
372 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
373 #if 1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
374 char* end = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
375 value = strtod(s.c_str(), &end);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
376 return (end == s.c_str() + s.size());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
377 #else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
378 return Orthanc::SerializationToolbox::ParseDouble(value, s);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
379 #endif
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
380 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
381
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
382
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
383 class StructurePolygon : public boost::noncopyable
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
384 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
385 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
386 std::string roiName_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
387 std::string referencedSopInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
388 uint8_t red_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
389 uint8_t green_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
390 uint8_t blue_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
391 std::vector<Vector3D> points_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
392
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
393 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
394 StructurePolygon(Orthanc::ParsedDicomFile& dicom,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
395 unsigned long roiIndex,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
396 unsigned long contourIndex)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
397 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
398 DcmDataset& dataset = *dicom.GetDcmtkObject().getDataset();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
399
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
400 DcmItem* structure = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
401 DcmItem* roi = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
402 DcmItem* contour = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
403 DcmSequenceOfItems* referenced = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
404
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
405 if (!dataset.findAndGetSequenceItem(DCM_StructureSetROISequence, structure, roiIndex).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
406 structure == NULL ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
407 !dataset.findAndGetSequenceItem(DCM_ROIContourSequence, roi, roiIndex).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
408 roi == NULL ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
409 !roi->findAndGetSequenceItem(DCM_ContourSequence, contour, contourIndex).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
410 contour == NULL ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
411 !contour->findAndGetSequence(DCM_ContourImageSequence, referenced).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
412 referenced == NULL ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
413 referenced->card() != 1)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
414 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
415 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
416 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
417
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
418 GetStringValue(roiName_, *structure, DCM_ROIName);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
419 GetStringValue(referencedSopInstanceUid_, *referenced->getItem(0), DCM_ReferencedSOPInstanceUID);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
420
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
421 std::string s;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
422 GetStringValue(s, *contour, DCM_ContourGeometricType);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
423 if (s != "CLOSED_PLANAR")
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
424 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
425 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
426 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
427
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
428 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
429 std::string color;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
430 GetStringValue(color, *roi, DCM_ROIDisplayColor);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
431
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
432 std::vector<std::string> tokens;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
433 Orthanc::Toolbox::TokenizeString(tokens, color, '\\');
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
434
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
435 uint32_t r, g, b;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
436 if (tokens.size() != 3 ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
437 !Orthanc::SerializationToolbox::ParseFirstUnsignedInteger32(r, tokens[0]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
438 !Orthanc::SerializationToolbox::ParseFirstUnsignedInteger32(g, tokens[1]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
439 !Orthanc::SerializationToolbox::ParseFirstUnsignedInteger32(b, tokens[2]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
440 r > 255 ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
441 g > 255 ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
442 b > 255)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
443 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
444 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
445 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
446
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
447 red_ = r;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
448 green_ = g;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
449 blue_ = b;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
450 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
451
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
452 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
453 GetStringValue(s, *contour, DCM_ContourData);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
454
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
455 std::vector<std::string> tokens;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
456 Orthanc::Toolbox::TokenizeString(tokens, s, '\\');
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
457
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
458 GetStringValue(s, *contour, DCM_NumberOfContourPoints);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
459
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
460 uint32_t countPoints;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
461 if (!Orthanc::SerializationToolbox::ParseUnsignedInteger32(countPoints, s) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
462 tokens.size() != 3 * countPoints)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
463 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
464 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
465 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
466
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
467 points_.reserve(countPoints);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
468
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
469 for (size_t i = 0; i < tokens.size(); i += 3)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
470 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
471 double x, y, z;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
472 if (!MyParseDouble(x, tokens[i]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
473 !MyParseDouble(y, tokens[i + 1]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
474 !MyParseDouble(z, tokens[i + 2]))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
475 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
476 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
477 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
478
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
479 points_.push_back(Vector3D(x, y, z));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
480 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
481
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
482 assert(points_.size() == countPoints);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
483 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
484 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
485
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
486 const std::string& GetRoiName() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
487 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
488 return roiName_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
489 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
490
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
491 const std::string& GetReferencedSopInstanceUid() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
492 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
493 return referencedSopInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
494 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
495
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
496 size_t GetPointsCount() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
497 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
498 return points_.size();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
499 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
500
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
501 const Vector3D& GetPoint(size_t i) const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
502 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
503 if (i >= points_.size())
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
504 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
505 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
506 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
507 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
508 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
509 return points_[i];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
510 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
511 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
512
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
513 bool IsCoplanar(Vector3D& normal) const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
514 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
515 if (points_.size() < 3)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
516 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
517 return false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
518 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
519
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
520 bool hasNormal = false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
521
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
522 for (size_t i = 0; i < points_.size(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
523 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
524 normal = Vector3D::CrossProduct(Vector3D(points_[1], points_[0]),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
525 Vector3D(points_[2], points_[0]));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
526 if (!IsNear(normal.ComputeNorm(), 0))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
527 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
528 normal.Normalize();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
529 hasNormal = true;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
530 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
531 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
532
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
533 if (!hasNormal)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
534 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
535 return false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
536 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
537
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
538 double a = Vector3D::DotProduct(points_[0], normal);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
539
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
540 for (size_t i = 1; i < points_.size(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
541 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
542 double b = Vector3D::DotProduct(points_[i], normal);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
543 if (!IsNear(a, b))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
544 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
545 return false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
546 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
547 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
548
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
549 return true;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
550 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
551
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
552 void Add(Extent2D& extent,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
553 const Vector3D& axisX,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
554 const Vector3D& axisY) const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
555 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
556 assert(IsNear(1, axisX.ComputeNorm()));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
557 assert(IsNear(1, axisY.ComputeNorm()));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
558
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
559 for (size_t i = 0; i < points_.size(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
560 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
561 extent.Add(Vector3D::DotProduct(axisX, points_[i]),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
562 Vector3D::DotProduct(axisY, points_[i]));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
563 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
564 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
565 };
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
566
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
567
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
568
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
569 struct IsNearPredicate
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
570 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
571 bool operator() (const double& a,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
572 const double& b)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
573 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
574 return IsNear(a, b);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
575 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
576 };
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
577
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
578 static void RemoveDuplicateValues(std::vector<double>& v)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
579 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
580 IsNearPredicate predicate;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
581 std::vector<double>::iterator last = std::unique(v.begin(), v.end(), predicate);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
582 v.erase(last, v.end());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
583 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
584
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
585
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
586 class StructureSet : public boost::noncopyable
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
587 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
588 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
589 std::vector<StructurePolygon*> polygons_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
590 bool hasGeometry_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
591 Vector3D slicesNormal_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
592 double slicesSpacing_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
593 double minProjectionAlongNormal_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
594 double maxProjectionAlongNormal_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
595 std::string patientId_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
596 std::string studyInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
597 std::string seriesInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
598 std::string sopInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
599
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
600 void ComputeGeometry()
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
601 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
602 std::list<double> positionsList;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
603 hasGeometry_ = false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
604
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
605 for (size_t i = 0; i < polygons_.size(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
606 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
607 assert(polygons_[i] != NULL);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
608
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
609 Vector3D n;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
610 if (polygons_[i]->IsCoplanar(n))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
611 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
612 const Vector3D& point = polygons_[i]->GetPoint(0);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
613 double z = Vector3D::DotProduct(point, n);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
614
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
615 if (!hasGeometry_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
616 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
617 hasGeometry_ = true;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
618 slicesNormal_ = n;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
619 minProjectionAlongNormal_ = z;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
620 maxProjectionAlongNormal_ = z;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
621 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
622 else if (!IsNear(std::abs(Vector3D::DotProduct(n, slicesNormal_)), 1))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
623 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
624 hasGeometry_ = false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
625
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
626 // RT-STRUCT with non-parallel slices
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
627 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
628 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
629 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
630 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
631 minProjectionAlongNormal_ = std::min(minProjectionAlongNormal_, z);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
632 maxProjectionAlongNormal_ = std::max(maxProjectionAlongNormal_, z);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
633 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
634
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
635 positionsList.push_back(Vector3D::DotProduct(n, point));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
636 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
637 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
638
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
639 if (hasGeometry_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
640 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
641 std::vector<double> positions(positionsList.begin(), positionsList.end());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
642 assert(!positions.empty());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
643
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
644 std::sort(positions.begin(), positions.end());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
645 RemoveDuplicateValues(positions);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
646 assert(!positions.empty());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
647
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
648 if (positions.size() == 1)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
649 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
650 hasGeometry_ = false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
651 return;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
652 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
653
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
654 std::vector<double> offsets;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
655 offsets.resize(positions.size() - 1);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
656
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
657 for (size_t i = 0; i < offsets.size(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
658 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
659 offsets[i] = positions[i + 1] - positions[i];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
660 assert(offsets[i] > 0);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
661 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
662
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
663 std::sort(offsets.begin(), offsets.end());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
664 RemoveDuplicateValues(offsets);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
665
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
666 slicesSpacing_ = offsets[0];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
667
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
668 for (size_t i = 1; i < offsets.size(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
669 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
670 double d = offsets[i] / slicesSpacing_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
671 if (!IsNear(d, round(d)))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
672 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
673 // Irregular spacing between the slices
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
674 hasGeometry_ = false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
675 break;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
676 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
677 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
678 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
679 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
680
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
681 void CheckHasGeometry() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
682 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
683 if (!hasGeometry_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
684 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
685 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
686 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
687 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
688
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
689 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
690 explicit StructureSet(Orthanc::ParsedDicomFile& dicom) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
691 hasGeometry_(false),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
692 slicesSpacing_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
693 minProjectionAlongNormal_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
694 maxProjectionAlongNormal_(0)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
695 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
696 DcmDataset& dataset = *dicom.GetDcmtkObject().getDataset();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
697 GetStringValue(patientId_, dataset, DCM_PatientID);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
698 GetStringValue(studyInstanceUid_, dataset, DCM_StudyInstanceUID);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
699 GetStringValue(seriesInstanceUid_, dataset, DCM_SeriesInstanceUID);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
700 GetStringValue(sopInstanceUid_, dataset, DCM_SOPInstanceUID);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
701
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
702 DcmSequenceOfItems* rois = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
703 if (!dataset.findAndGetSequence(DCM_ROIContourSequence, rois).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
704 rois == NULL)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
705 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
706 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
707 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
708
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
709 std::vector<DcmSequenceOfItems*> contours(rois->card());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
710 size_t countPolygons = 0;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
711
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
712 for (unsigned long i = 0; i < rois->card(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
713 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
714 DcmSequenceOfItems* contour = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
715 if (!rois->getItem(i)->findAndGetSequence(DCM_ContourSequence, contour).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
716 contour == NULL)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
717 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
718 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
719 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
720 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
721 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
722 contours[i] = contour;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
723 countPolygons += contour->card();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
724 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
725 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
726
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
727 polygons_.resize(countPolygons);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
728
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
729 size_t pos = 0;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
730 for (unsigned long i = 0; i < contours.size(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
731 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
732 for (unsigned long j = 0; j < contours[i]->card(); j++, pos++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
733 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
734 polygons_[pos] = new StructurePolygon(dicom, i, j);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
735 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
736 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
737
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
738 assert(pos == countPolygons);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
739
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
740 ComputeGeometry();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
741 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
742
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
743 ~StructureSet()
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
744 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
745 for (size_t i = 0; i < polygons_.size(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
746 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
747 assert(polygons_[i] != NULL);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
748 delete polygons_[i];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
749 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
750 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
751
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
752 const std::string& GetPatient() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
753 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
754 return patientId_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
755 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
756
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
757 const std::string& GetStudyInstanceUid() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
758 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
759 return studyInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
760 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
761
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
762 const std::string& GetSeriesInstanceUid() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
763 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
764 return seriesInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
765 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
766
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
767 const std::string& GetSopInstanceUid() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
768 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
769 return sopInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
770 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
771
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
772 std::string HashStudy() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
773 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
774 std::string s;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
775 Orthanc::Toolbox::ComputeSHA1(s, patientId_ + "|" + studyInstanceUid_);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
776 return s;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
777 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
778
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
779 size_t GetPolygonsCount() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
780 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
781 return polygons_.size();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
782 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
783
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
784 const StructurePolygon& GetPolygon(size_t i) const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
785 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
786 if (i >= polygons_.size())
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
787 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
788 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
789 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
790 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
791 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
792 assert(polygons_[i] != NULL);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
793 return *polygons_[i];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
794 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
795 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
796
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
797 bool HasGeometry() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
798 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
799 return hasGeometry_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
800 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
801
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
802 const Vector3D& GetSlicesNormal() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
803 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
804 CheckHasGeometry();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
805 return slicesNormal_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
806 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
807
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
808 double GetSlicesSpacing() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
809 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
810 CheckHasGeometry();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
811 return slicesSpacing_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
812 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
813
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
814 double GetMinProjectionAlongNormal() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
815 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
816 CheckHasGeometry();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
817 return minProjectionAlongNormal_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
818 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
819
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
820 double GetMaxProjectionAlongNormal() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
821 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
822 CheckHasGeometry();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
823 return maxProjectionAlongNormal_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
824 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
825
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
826 double ProjectAlongNormal(const StructurePolygon& polygon) const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
827 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
828 CheckHasGeometry();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
829 return Vector3D::DotProduct(slicesNormal_, polygon.GetPoint(0));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
830 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
831
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
832 size_t GetSlicesCount() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
833 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
834 CheckHasGeometry();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
835 double c = (maxProjectionAlongNormal_ - minProjectionAlongNormal_) / slicesSpacing_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
836 assert(c >= 0);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
837
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
838 if (!IsNear(c, round(c)))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
839 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
840 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
841 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
842 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
843 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
844 return static_cast<size_t>(round(c)) + 1;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
845 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
846 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
847
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
848 bool LookupSliceIndex(size_t& slice,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
849 const StructurePolygon& polygon) const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
850 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
851 CheckHasGeometry();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
852
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
853 double z = ProjectAlongNormal(polygon);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
854
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
855 if (z < minProjectionAlongNormal_ ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
856 z > maxProjectionAlongNormal_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
857 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
858 return false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
859 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
860 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
861 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
862 double c = (z - minProjectionAlongNormal_) / slicesSpacing_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
863
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
864 if (IsNear(c, round(c)))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
865 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
866 slice = static_cast<size_t>(round(c));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
867 return true;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
868 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
869 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
870 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
871 return false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
872 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
873 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
874 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
875
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
876 bool LookupReferencedSopInstanceUid(std::string& sopInstanceUid) const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
877 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
878 if (HasGeometry())
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
879 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
880 for (size_t i = 0; i < polygons_.size(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
881 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
882 assert(polygons_[i] != NULL);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
883
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
884 Vector3D n;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
885 if (polygons_[i]->IsCoplanar(n) &&
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
886 Vector3D::DotProduct(n, slicesNormal_))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
887 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
888 sopInstanceUid = polygons_[i]->GetReferencedSopInstanceUid();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
889 return true;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
890 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
891 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
892 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
893
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
894 return false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
895 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
896 };
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
897
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
898
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
899
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
900
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
901 class XorFiller : public Orthanc::ImageProcessing::IPolygonFiller
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
902 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
903 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
904 Orthanc::ImageAccessor& target_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
905
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
906 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
907 XorFiller(Orthanc::ImageAccessor& target) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
908 target_(target)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
909 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
910 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
911
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
912 virtual void Fill(int y,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
913 int x1,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
914 int x2) ORTHANC_OVERRIDE
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
915 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
916 assert(x1 <= x2);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
917
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
918 if (y >= 0 &&
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
919 y < static_cast<int>(target_.GetHeight()))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
920 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
921 x1 = std::max(x1, 0);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
922 x2 = std::min(x2, static_cast<int>(target_.GetWidth()) - 1);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
923
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
924 uint8_t* p = reinterpret_cast<uint8_t*>(target_.GetRow(y)) + x1;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
925
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
926 for (int i = x1; i <= x2; i++, p++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
927 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
928 *p = (*p ^ 0xff);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
929 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
930 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
931 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
932 };
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
933
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
934
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
935 static void EncodeSTL(std::string& target /* out */,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
936 vtkPolyData& mesh /* in */)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
937 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
938 // TODO - Conversion to little endian on big endian
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
939
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
940 Orthanc::ChunkedBuffer buffer;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
941
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
942 uint8_t header[80];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
943 memset(header, 0, sizeof(header));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
944 buffer.AddChunk(header, sizeof(header));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
945
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
946 uint32_t n = mesh.GetNumberOfCells();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
947 buffer.AddChunk(&n, sizeof(n));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
948
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
949 for (vtkIdType i = 0; i < mesh.GetNumberOfCells(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
950 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
951 vtkCell* cell = mesh.GetCell(i);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
952 vtkTriangle* triangle = dynamic_cast<vtkTriangle*>(cell);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
953
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
954 double p0[3];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
955 double p1[3];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
956 double p2[3];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
957 triangle->GetPoints()->GetPoint(0, p0);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
958 triangle->GetPoints()->GetPoint(1, p1);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
959 triangle->GetPoints()->GetPoint(2, p2);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
960
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
961 double normal[3];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
962 vtkTriangle::ComputeNormal(p0, p1, p2, normal);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
963
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
964 float d[4 * 3] = {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
965 static_cast<float>(normal[0]), static_cast<float>(normal[1]), static_cast<float>(normal[2]),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
966 static_cast<float>(p0[0]), static_cast<float>(p0[1]), static_cast<float>(p0[2]),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
967 static_cast<float>(p1[0]), static_cast<float>(p1[1]), static_cast<float>(p1[2]),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
968 static_cast<float>(p2[0]), static_cast<float>(p2[1]), static_cast<float>(p2[2]) };
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
969 buffer.AddChunk(d, sizeof(d));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
970
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
971 uint16_t a = 0;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
972 buffer.AddChunk(&a, sizeof(a));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
973 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
974
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
975 buffer.Flatten(target);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
976 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
977
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
978
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
979 bool EncodeStructureSetMesh(std::string& stl,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
980 const StructureSet& structureSet,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
981 const std::set<std::string>& roiNames,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
982 unsigned int resolution,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
983 bool smooth)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
984 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
985 if (!structureSet.HasGeometry())
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
986 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
987 return false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
988 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
989
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
990 if (resolution < 1)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
991 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
992 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
993 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
994
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
995 if (!IsNear(1, structureSet.GetSlicesNormal().ComputeNorm()))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
996 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
997 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
998 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
999
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1000 // TODO - Axes could be retrieved from the referenced CT volume
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1001 Vector3D axisX(1, 0, 0);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1002 Vector3D axisY = Vector3D::CrossProduct(structureSet.GetSlicesNormal(), axisX);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1003
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1004 if (!IsNear(1, axisX.ComputeNorm()) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1005 !IsNear(1, axisY.ComputeNorm()))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1006 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1007 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1008 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1009
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1010 Extent2D extent;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1011 for (size_t i = 0; i < structureSet.GetPolygonsCount(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1012 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1013 structureSet.GetPolygon(i).Add(extent, axisX, axisY);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1014 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1015
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1016 const int depth = structureSet.GetSlicesCount();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1017
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1018 vtkNew<vtkImageData> volume;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1019 volume->SetDimensions(resolution, resolution, depth);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1020 volume->AllocateScalars(VTK_UNSIGNED_CHAR, 1);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1021
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1022 assert(sizeof(unsigned char) == 1);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1023 memset(volume->GetScalarPointer(), 0, resolution * resolution * depth);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1024
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1025 for (size_t i = 0; i < structureSet.GetPolygonsCount(); i++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1026 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1027 const StructurePolygon& polygon = structureSet.GetPolygon(i);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1028 if (roiNames.find(polygon.GetRoiName()) == roiNames.end())
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1029 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1030 // This polygon doesn't correspond to a ROI of interest
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1031 continue;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1032 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1033
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1034 size_t j;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1035 if (!structureSet.LookupSliceIndex(j, polygon))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1036 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1037 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1038 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1039
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1040 std::vector<Orthanc::ImageProcessing::ImagePoint> points;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1041 points.reserve(polygon.GetPointsCount());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1042 for (size_t j = 0; j < polygon.GetPointsCount(); j++)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1043 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1044 const Vector3D& point = polygon.GetPoint(j);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1045 double x = (Vector3D::DotProduct(point, axisX) - extent.GetMinX()) / extent.GetWidth() * static_cast<double>(resolution);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1046 double y = (Vector3D::DotProduct(point, axisY) - extent.GetMinY()) / extent.GetHeight() * static_cast<double>(resolution);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1047 points.push_back(Orthanc::ImageProcessing::ImagePoint(static_cast<int32_t>(std::floor(x)),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1048 static_cast<int32_t>(std::floor(y))));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1049 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1050
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1051 Orthanc::ImageAccessor slice;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1052 slice.AssignWritable(Orthanc::PixelFormat_Grayscale8, resolution, resolution, resolution /* pitch */,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1053 reinterpret_cast<uint8_t*>(volume->GetScalarPointer()) + j * resolution * resolution);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1054
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1055 XorFiller filler(slice);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1056 Orthanc::ImageProcessing::FillPolygon(filler, points);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1057 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1058
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1059 vtkNew<vtkImageResize> resize;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1060 resize->SetOutputDimensions(resolution, resolution, resolution);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1061 resize->SetInputData(volume.Get());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1062 resize->Update();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1063
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1064 resize->GetOutput()->SetSpacing(
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1065 extent.GetWidth() / static_cast<double>(resolution),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1066 extent.GetHeight() / static_cast<double>(resolution),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1067 (structureSet.GetMaxProjectionAlongNormal() - structureSet.GetMinProjectionAlongNormal()) / static_cast<double>(resolution));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1068
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1069 // TODO
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1070 // resize->GetOutput()->SetOrigin()
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1071
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1072 vtkNew<vtkImageConstantPad> padding;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1073 padding->SetConstant(0);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1074 padding->SetOutputNumberOfScalarComponents(1);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1075 padding->SetOutputWholeExtent(-1, resolution, -1, resolution, -1, resolution);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1076 padding->SetInputData(resize->GetOutput());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1077 padding->Update();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1078
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1079 vtkNew<vtkMarchingCubes> surface;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1080 surface->SetInputData(padding->GetOutput());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1081 surface->ComputeNormalsOn();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1082 surface->SetValue(0, 128 /*isoValue*/);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1083 surface->Update();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1084
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1085 if (smooth)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1086 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1087 vtkNew<vtkSmoothPolyDataFilter> smoothFilter;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1088 // Apply volume smoothing
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1089 // https://examples.vtk.org/site/Cxx/PolyData/SmoothPolyDataFilter/
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1090 smoothFilter->SetInputConnection(surface->GetOutputPort());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1091 smoothFilter->SetNumberOfIterations(15);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1092 smoothFilter->SetRelaxationFactor(0.1);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1093 smoothFilter->FeatureEdgeSmoothingOff();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1094 smoothFilter->BoundarySmoothingOn();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1095 smoothFilter->Update();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1096
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1097 vtkNew<vtkPolyDataNormals> normalGenerator;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1098 normalGenerator->SetInputConnection(smoothFilter->GetOutputPort());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1099 normalGenerator->ComputePointNormalsOn();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1100 normalGenerator->ComputeCellNormalsOn();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1101 normalGenerator->Update();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1102
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1103 EncodeSTL(stl, *normalGenerator->GetOutput());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1104 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1105 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1106 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1107 EncodeSTL(stl, *surface->GetOutput());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1108 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1109
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1110 return true;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1111 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1112
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1113
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1114 void ListStructures(OrthancPluginRestOutput* output,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1115 const char* url,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1116 const OrthancPluginHttpRequest* request)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1117 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1118 const std::string instanceId(request->groups[0]);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1119
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1120 if (request->method != OrthancPluginHttpMethod_Get)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1121 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1122 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "GET");
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1123 return;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1124 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1125
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1126 std::string dicom;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1127 if (!OrthancPlugins::RestApiGetString(dicom, "/instances/" + instanceId + "/file", false))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1128 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1129 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1130 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1131 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1132 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1133 Orthanc::ParsedDicomFile parsed(dicom);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1134
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1135 std::set<std::string> names;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1136 ListStructuresNames(names, parsed);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1137
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1138 Json::Value answer = Json::arrayValue;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1139
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1140 for (std::set<std::string>::const_iterator it = names.begin(); it != names.end(); ++it)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1141 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1142 answer.append(*it);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1143 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1144
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1145 std::string s = answer.toStyledString();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1146 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, s.c_str(), s.size(), Orthanc::MIME_JSON);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1147 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1148 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1149
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1150
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1151 void Encode(OrthancPluginRestOutput* output,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1152 const char* url,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1153 const OrthancPluginHttpRequest* request)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1154 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1155 static const char* const KEY_INSTANCE = "Instance";
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1156 static const char* const KEY_RESOLUTION = "Resolution";
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1157 static const char* const KEY_ROI_NAMES = "RoiNames";
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1158 static const char* const KEY_SMOOTH = "Smooth";
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1159 static const char* const KEY_TAGS = "Tags";
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1160
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1161 if (request->method != OrthancPluginHttpMethod_Post)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1162 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1163 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "POST");
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1164 return;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1165 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1166
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1167 Json::Value body;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1168 if (!Orthanc::Toolbox::ReadJson(body, request->body, request->bodySize))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1169 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1170 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1171 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1172
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1173 const std::string instanceId = Orthanc::SerializationToolbox::ReadString(body, KEY_INSTANCE);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1174 const bool smooth = (body.isMember(KEY_SMOOTH) ?
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1175 Orthanc::SerializationToolbox::ReadBoolean(body, KEY_SMOOTH) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1176 true /* smooth by default */);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1177 const unsigned int resolution = (body.isMember(KEY_RESOLUTION) ?
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1178 Orthanc::SerializationToolbox::ReadUnsignedInteger(body, KEY_RESOLUTION) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1179 256 /* default value */);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1180
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1181 std::set<std::string> roiNames;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1182 Orthanc::SerializationToolbox::ReadSetOfStrings(roiNames, body, KEY_ROI_NAMES);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1183
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1184 std::string dicom;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1185 if (!OrthancPlugins::RestApiGetString(dicom, "/instances/" + instanceId + "/file", false))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1186 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1187 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1188 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1189 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1190 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1191 Orthanc::ParsedDicomFile parsed(dicom);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1192 StructureSet structureSet(parsed);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1193
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1194 std::string stl;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1195 if (!EncodeStructureSetMesh(stl, structureSet, roiNames, resolution, smooth))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1196 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1197 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Cannot encode STL");
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1198 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1199 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1200 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1201 std::string content;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1202 Orthanc::Toolbox::EncodeDataUriScheme(content, "model/stl", stl);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1203
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1204 Json::Value create;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1205 create["Content"] = content;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1206 create["Parent"] = structureSet.HashStudy();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1207
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1208 if (body.isMember(KEY_TAGS))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1209 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1210 create[KEY_TAGS] = body[KEY_TAGS];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1211 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1212 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1213 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1214 std::string description;
2
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1215
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1216 if (parsed.GetTagValue(description, Orthanc::DICOM_TAG_SERIES_DESCRIPTION))
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1217 {
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1218 description += ": ";
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1219 }
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1220 else
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1221 {
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1222 description.clear();
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1223 }
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1224
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1225 bool first = true;
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1226 for (std::set<std::string>::const_iterator it = roiNames.begin(); it != roiNames.end(); ++it)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1227 {
2
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1228 if (first)
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1229 {
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1230 first = false;
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1231 }
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1232 else
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1233 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1234 description += ", ";
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1235 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1236
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1237 description += *it;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1238 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1239
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1240 create[KEY_TAGS] = Json::objectValue;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1241 create[KEY_TAGS]["SeriesDescription"] = description;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1242 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1243
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1244 Json::Value answer;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1245 if (OrthancPlugins::RestApiPost(answer, "/tools/create-dicom", create.toStyledString(), false))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1246 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1247 std::string s = answer.toStyledString();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1248 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, s.c_str(), s.size(), Orthanc::MIME_JSON);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1249 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1250 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1251 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1252 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest, "Cannot create DICOM from STL");
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1253 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1254 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1255 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1256 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1257
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1258
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1259 extern "C"
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1260 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1261 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1262 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1263 OrthancPlugins::SetGlobalContext(context);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1264
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1265 /* Check the version of the Orthanc core */
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1266 if (OrthancPluginCheckVersion(OrthancPlugins::GetGlobalContext()) == 0)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1267 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1268 char info[1024];
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1269 sprintf(info, "Your version of Orthanc (%s) must be above %d.%d.%d to run this plugin",
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1270 OrthancPlugins::GetGlobalContext()->orthancVersion,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1271 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1272 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1273 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1274 OrthancPluginLogError(OrthancPlugins::GetGlobalContext(), info);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1275 return -1;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1276 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1277
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1278 #if ORTHANC_FRAMEWORK_VERSION_IS_ABOVE(1, 7, 2)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1279 Orthanc::Logging::InitializePluginContext(context);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1280 #else
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1281 Orthanc::Logging::Initialize(context);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1282 #endif
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1283
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1284 Orthanc::InitializeFramework("", false);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1285
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1286 hasCreateDicomStl_ = OrthancPlugins::CheckMinimalOrthancVersion(1, 12, 1);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1287
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1288 if (!hasCreateDicomStl_)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1289 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1290 LOG(WARNING) << "Your version of Orthanc (" << std::string(context->orthancVersion)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1291 << ") is insufficient to create DICOM STL, it should be above 1.12.1";
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1292 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1293
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1294 OrthancPluginSetDescription(context, "STL plugin for Orthanc.");
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1295
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1296 OrthancPlugins::RegisterRestCallback<ServeFile>("/stl/app/(.*)", true);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1297 OrthancPlugins::RegisterRestCallback<ListStructures>("/stl/rt-struct/([0-9a-f-]+)", true);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1298
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1299 if (hasCreateDicomStl_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1300 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1301 OrthancPlugins::RegisterRestCallback<Encode>("/stl/encode", true);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1302 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1303
2
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1304 // Extend the default Orthanc Explorer with custom JavaScript for STL
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1305 std::string explorer;
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1306
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1307 {
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1308 Orthanc::EmbeddedResources::GetFileResource(explorer, Orthanc::EmbeddedResources::ORTHANC_EXPLORER);
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1309
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1310 std::map<std::string, std::string> dictionary;
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1311 dictionary["HAS_CREATE_DICOM_STL"] = (hasCreateDicomStl_ ? "true" : "false");
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1312 explorer = Orthanc::Toolbox::SubstituteVariables(explorer, dictionary);
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1313
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1314 OrthancPluginExtendOrthancExplorer(OrthancPlugins::GetGlobalContext(), explorer.c_str());
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1315 }
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1316
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1317 return 0;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1318 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1319
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1320
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1321 ORTHANC_PLUGINS_API void OrthancPluginFinalize()
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1322 {
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1323 Orthanc::FinalizeFramework();
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1324 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1325
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1326
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1327 ORTHANC_PLUGINS_API const char* OrthancPluginGetName()
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1328 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1329 return "stl";
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1330 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1331
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1332
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1333 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion()
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1334 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1335 return ORTHANC_STL_VERSION;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1336 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1337 }