annotate Sources/Plugin.cpp @ 28:410003c50b17

improved computation of RT-STRUCT geometry
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 04 Apr 2024 10:10:40 +0200
parents 5fc3ea6acbd5
children 62abf3c523f9
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 /**
24
dd0cd39e6259 update year to 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 8
diff changeset
2 * SPDX-FileCopyrightText: 2023-2024 Sebastien Jodogne, UCLouvain, Belgium
0
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
24
dd0cd39e6259 update year to 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 8
diff changeset
8 * Copyright (C) 2023-2024 Sebastien Jodogne, UCLouvain, Belgium
0
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
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
27 #include <EmbeddedResources.h>
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
28
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
29 #include <DicomFormat/DicomInstanceHasher.h>
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
30 #include <Compression/GzipCompressor.h>
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
31 #include <ChunkedBuffer.h>
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
32 #include <DicomParsing/FromDcmtkBridge.h>
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
33 #include <DicomParsing/ParsedDicomFile.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
34 #include <Images/ImageProcessing.h>
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 #include <Logging.h>
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
36 #include <OrthancFramework.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
37 #include <SerializationToolbox.h>
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 #include <SystemToolbox.h>
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
40 #include <vtkImageConstantPad.h>
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
41 #include <vtkImageData.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
42 #include <vtkImageResize.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
43 #include <vtkMarchingCubes.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
44 #include <vtkNew.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
45 #include <vtkPolyData.h>
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
46 #include <vtkPolyDataNormals.h>
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
47 #include <vtkSmoothPolyDataFilter.h>
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
48 #include <vtkTriangle.h>
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
49
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 #include <boost/thread/shared_mutex.hpp>
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
52 #include <nifti1_io.h>
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
53
25
5fc3ea6acbd5 fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 24
diff changeset
54 #define ORTHANC_PLUGIN_NAME "stl"
5fc3ea6acbd5 fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 24
diff changeset
55
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
56 static const char* const STL_SOP_CLASS_UID = "1.2.840.10008.5.1.4.1.1.104.3";
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
57
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
58
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 // Forward declaration
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 void ReadStaticAsset(std::string& target,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 const std::string& path);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62
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 /**
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 * 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
66 * "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
67 * 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
68 **/
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 class ResourcesCache : public boost::noncopyable
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 private:
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 typedef std::map<std::string, std::string*> Content;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 boost::shared_mutex mutex_;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 Content content_;
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 public:
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 ~ResourcesCache()
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 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
81 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 assert(it->second != NULL);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 delete it->second;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 }
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
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 void Answer(OrthancPluginRestOutput* output,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 const std::string& path)
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 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
91
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 // Check whether the cache already contains the resource
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 boost::shared_lock<boost::shared_mutex> lock(mutex_);
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 Content::const_iterator found = content_.find(path);
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 if (found != content_.end())
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 assert(found->second != NULL);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 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
102 return;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 }
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 // This resource has not been cached yet
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 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
109 ReadStaticAsset(*item, path);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 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
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 // Store the resource into the cache
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114 boost::unique_lock<boost::shared_mutex> lock(mutex_);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 if (content_.find(path) == content_.end())
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 content_[path] = item.release();
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 }
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 };
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
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 static ResourcesCache cache_;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 static bool hasCreateDicomStl_;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 void ServeFile(OrthancPluginRestOutput* output,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 const char* url,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130 const OrthancPluginHttpRequest* request)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 {
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
132 if (request->method != OrthancPluginHttpMethod_Get)
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
133 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
134 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "GET");
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
135 return;
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
136 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
137
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 std::string file = request->groups[0];
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 if (file == "viewer.html")
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 std::string s;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 Orthanc::EmbeddedResources::GetFileResource(s, Orthanc::EmbeddedResources::VIEWER_HTML);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 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
145 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 else if (file == "viewer.js")
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 std::string s;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149 Orthanc::EmbeddedResources::GetFileResource(s, Orthanc::EmbeddedResources::VIEWER_JS);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 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
151 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 else
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 cache_.Answer(output, file);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
159
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 #include <dcmtk/dcmdata/dcdeftag.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
162 #include <dcmtk/dcmdata/dcfilefo.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
163 #include <dcmtk/dcmdata/dcitem.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
164 #include <dcmtk/dcmdata/dcsequen.h>
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 class Extent2D : public boost::noncopyable
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
167 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
168 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
169 bool isEmpty_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
170 double x1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
171 double y1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
172 double x2_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
173 double y2_;
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 void CheckNotEmpty() const
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 if (isEmpty_)
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
183 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
184 Extent2D() :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
185 isEmpty_(true),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
186 x1_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
187 y1_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
188 x2_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
189 y2_(0)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
190 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
191 }
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 bool IsEmpty() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
194 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
195 return isEmpty_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
196 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
197
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
198 double GetMinX() const
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 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
201 return x1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
202 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
203
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
204 double GetMaxX() const
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 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
207 return x2_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
208 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
209
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
210 double GetMinY() const
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 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
213 return y1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
214 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
215
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
216 double GetMaxY() const
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 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
219 return y2_;
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
222 double GetWidth() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
223 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
224 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
225 return x2_ - x1_;
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
228 double GetHeight() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
229 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
230 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
231 return y2_ - y1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
232 }
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 void Add(double x,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
235 double y)
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 if (isEmpty_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
238 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
239 x1_ = x2_ = x;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
240 y1_ = y2_ = y;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
241 isEmpty_ = false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
242 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
243 else
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 x1_ = std::min(x1_, x);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
246 x2_ = std::max(x2_, x);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
247 y1_ = std::min(y1_, y);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
248 y2_ = std::max(y2_, y);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
249 }
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
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
253 static std::string GetStringValue(DcmItem& item,
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
254 const DcmTagKey& key)
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
255 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
256 const char* s = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
257 if (!item.findAndGetString(key, s).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
258 s == NULL)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
259 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
260 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
261 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
262 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
263 {
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
264 return Orthanc::Toolbox::StripSpaces(s);
1
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 }
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
269 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
270 Orthanc::ParsedDicomFile& source)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
271 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
272 target.clear();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
273
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
274 DcmSequenceOfItems* sequence = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
275 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
276 sequence == NULL)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
277 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
278 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
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 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
282 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
283 DcmItem* item = sequence->getItem(i);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
284 if (item == NULL)
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
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 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
289 {
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
290 target.insert(GetStringValue(*item, DCM_ROIName));
1
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 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
293 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
294
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
295
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
296 static bool IsNear(double a,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
297 double b)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
298 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
299 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
300 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
301
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 class Vector3D
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 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
306 double x_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
307 double y_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
308 double z_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
309
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
310 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
311 Vector3D() :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
312 x_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
313 y_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
314 z_(0)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
315 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
316 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
317
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
318 Vector3D(double x,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
319 double y,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
320 double z) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
321 x_(x),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
322 y_(y),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
323 z_(z)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
324 {
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 Vector3D(const Vector3D& from,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
328 const Vector3D& to) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
329 x_(to.x_ - from.x_),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
330 y_(to.y_ - from.y_),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
331 z_(to.z_ - from.z_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
332 {
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
335 double GetX() const
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 return x_;
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
340 double GetY() const
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 return y_;
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
345 double GetZ() const
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 return z_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
348 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
349
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
350 double ComputeNorm() const
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 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
353 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
354
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
355 void Normalize()
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
356 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
357 double norm = ComputeNorm();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
358 if (!IsNear(norm, 0))
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 x_ /= norm;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
361 y_ /= norm;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
362 z_ /= norm;
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 }
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 static Vector3D CrossProduct(const Vector3D& u,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
367 const Vector3D& v)
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 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
370 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
371 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
372 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
373
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
374 static double DotProduct(const Vector3D& a,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
375 const Vector3D& b)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
376 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
377 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
378 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
379 };
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 static bool MyParseDouble(double& value,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
384 const std::string& s)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
385 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
386 #if 1
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
387 // This version is much faster, as "ParseDouble()" internally uses
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
388 // "boost::lexical_cast<double>()"
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
389 char* end = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
390 value = strtod(s.c_str(), &end);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
391 return (end == s.c_str() + s.size());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
392 #else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
393 return Orthanc::SerializationToolbox::ParseDouble(value, s);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
394 #endif
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
395 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
396
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 class StructurePolygon : public boost::noncopyable
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 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
401 std::string roiName_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
402 std::string referencedSopInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
403 uint8_t red_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
404 uint8_t green_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
405 uint8_t blue_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
406 std::vector<Vector3D> points_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
407
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
408 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
409 StructurePolygon(Orthanc::ParsedDicomFile& dicom,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
410 unsigned long roiIndex,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
411 unsigned long contourIndex)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
412 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
413 DcmDataset& dataset = *dicom.GetDcmtkObject().getDataset();
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 DcmItem* structure = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
416 DcmItem* roi = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
417 DcmItem* contour = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
418 DcmSequenceOfItems* referenced = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
419
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
420 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
421 structure == NULL ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
422 !dataset.findAndGetSequenceItem(DCM_ROIContourSequence, roi, roiIndex).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
423 roi == NULL ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
424 !roi->findAndGetSequenceItem(DCM_ContourSequence, contour, contourIndex).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
425 contour == NULL ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
426 !contour->findAndGetSequence(DCM_ContourImageSequence, referenced).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
427 referenced == NULL ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
428 referenced->card() != 1)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
429 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
430 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
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
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
433 roiName_ = GetStringValue(*structure, DCM_ROIName);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
434 referencedSopInstanceUid_ = GetStringValue(*referenced->getItem(0), DCM_ReferencedSOPInstanceUID);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
435
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
436 if (GetStringValue(*contour, DCM_ContourGeometricType) != "CLOSED_PLANAR")
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
437 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
438 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
439 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
440
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
441 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
442 std::vector<std::string> tokens;
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
443 Orthanc::Toolbox::TokenizeString(tokens, GetStringValue(*roi, DCM_ROIDisplayColor), '\\');
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
444
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
445 uint32_t r, g, b;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
446 if (tokens.size() != 3 ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
447 !Orthanc::SerializationToolbox::ParseFirstUnsignedInteger32(r, tokens[0]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
448 !Orthanc::SerializationToolbox::ParseFirstUnsignedInteger32(g, tokens[1]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
449 !Orthanc::SerializationToolbox::ParseFirstUnsignedInteger32(b, tokens[2]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
450 r > 255 ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
451 g > 255 ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
452 b > 255)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
453 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
454 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
455 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
456
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
457 red_ = r;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
458 green_ = g;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
459 blue_ = b;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
460 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
461
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
462 {
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
463 std::vector<std::string> tokens;
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
464 Orthanc::Toolbox::TokenizeString(tokens, GetStringValue(*contour, DCM_ContourData), '\\');
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
465
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
466 const std::string s = GetStringValue(*contour, DCM_NumberOfContourPoints);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
467
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
468 uint32_t countPoints;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
469 if (!Orthanc::SerializationToolbox::ParseUnsignedInteger32(countPoints, s) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
470 tokens.size() != 3 * countPoints)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
471 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
472 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
473 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
474
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
475 points_.reserve(countPoints);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
476
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
477 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
478 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
479 double x, y, z;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
480 if (!MyParseDouble(x, tokens[i]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
481 !MyParseDouble(y, tokens[i + 1]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
482 !MyParseDouble(z, tokens[i + 2]))
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
487 points_.push_back(Vector3D(x, y, z));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
488 }
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 assert(points_.size() == countPoints);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
491 }
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
494 const std::string& GetRoiName() const
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 return roiName_;
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
499 const std::string& GetReferencedSopInstanceUid() const
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 return referencedSopInstanceUid_;
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
504 size_t GetPointsCount() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
505 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
506 return points_.size();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
507 }
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 const Vector3D& GetPoint(size_t i) const
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 if (i >= points_.size())
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
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 else
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 points_[i];
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
521 bool IsCoplanar(Vector3D& normal) const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
522 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
523 if (points_.size() < 3)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
524 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
525 return false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
526 }
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 bool hasNormal = false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
529
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
530 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
531 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
532 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
533 Vector3D(points_[2], points_[0]));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
534 if (!IsNear(normal.ComputeNorm(), 0))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
535 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
536 normal.Normalize();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
537 hasNormal = true;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
538 }
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
541 if (!hasNormal)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
542 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
543 return false;
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
546 double a = Vector3D::DotProduct(points_[0], normal);
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 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
549 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
550 double b = Vector3D::DotProduct(points_[i], normal);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
551 if (!IsNear(a, b))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
552 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
553 return false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
554 }
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
557 return true;
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
560 void Add(Extent2D& extent,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
561 const Vector3D& axisX,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
562 const Vector3D& axisY) const
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 assert(IsNear(1, axisX.ComputeNorm()));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
565 assert(IsNear(1, axisY.ComputeNorm()));
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 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
568 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
569 extent.Add(Vector3D::DotProduct(axisX, points_[i]),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
570 Vector3D::DotProduct(axisY, points_[i]));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
571 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
572 }
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
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 struct IsNearPredicate
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
578 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
579 bool operator() (const double& a,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
580 const double& b)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
581 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
582 return IsNear(a, b);
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 static void RemoveDuplicateValues(std::vector<double>& v)
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 IsNearPredicate predicate;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
589 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
590 v.erase(last, v.end());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
591 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
592
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
593
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
594 class StructureSet : public boost::noncopyable
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
595 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
596 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
597 std::vector<StructurePolygon*> polygons_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
598 std::string patientId_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
599 std::string studyInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
600 std::string seriesInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
601 std::string sopInstanceUid_;
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
602 bool hasFrameOfReferenceUid_;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
603 std::string frameOfReferenceUid_;
1
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 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
606 explicit StructureSet(Orthanc::ParsedDicomFile& dicom) :
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
607 hasFrameOfReferenceUid_(false)
1
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 DcmDataset& dataset = *dicom.GetDcmtkObject().getDataset();
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
610 patientId_ = GetStringValue(dataset, DCM_PatientID);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
611 studyInstanceUid_ = GetStringValue(dataset, DCM_StudyInstanceUID);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
612 seriesInstanceUid_ = GetStringValue(dataset, DCM_SeriesInstanceUID);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
613 sopInstanceUid_ = GetStringValue(dataset, DCM_SOPInstanceUID);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
614
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
615 DcmSequenceOfItems* frame = NULL;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
616 if (!dataset.findAndGetSequence(DCM_ReferencedFrameOfReferenceSequence, frame).good() ||
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
617 frame == NULL)
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
618 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
619 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
620 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
621
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
622 if (frame->card() == 1)
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
623 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
624 const char* v = NULL;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
625 if (frame->getItem(0)->findAndGetString(DCM_FrameOfReferenceUID, v).good() &&
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
626 v != NULL)
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
627 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
628 hasFrameOfReferenceUid_ = true;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
629 frameOfReferenceUid_.assign(v);
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
630 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
631 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
632
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
633 DcmSequenceOfItems* rois = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
634 if (!dataset.findAndGetSequence(DCM_ROIContourSequence, rois).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
635 rois == NULL)
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
640 std::vector<DcmSequenceOfItems*> contours(rois->card());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
641 size_t countPolygons = 0;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
642
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
643 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
644 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
645 DcmSequenceOfItems* contour = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
646 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
647 contour == NULL)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
648 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
649 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
650 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
651 else
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 contours[i] = contour;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
654 countPolygons += contour->card();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
655 }
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
658 polygons_.resize(countPolygons);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
659
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
660 size_t pos = 0;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
661 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
662 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
663 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
664 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
665 polygons_[pos] = new StructurePolygon(dicom, i, j);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
666 }
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
669 assert(pos == countPolygons);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
670 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
671
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
672 ~StructureSet()
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
673 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
674 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
675 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
676 assert(polygons_[i] != NULL);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
677 delete polygons_[i];
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 const std::string& GetPatient() 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 return patientId_;
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
686 const std::string& GetStudyInstanceUid() const
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 return studyInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
689 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
690
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
691 const std::string& GetSeriesInstanceUid() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
692 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
693 return seriesInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
694 }
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 const std::string& GetSopInstanceUid() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
697 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
698 return sopInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
699 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
700
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
701 std::string HashStudy() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
702 {
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
703 Orthanc::DicomInstanceHasher hasher(patientId_, studyInstanceUid_, seriesInstanceUid_, sopInstanceUid_);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
704 return hasher.HashStudy();
1
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
707 size_t GetPolygonsCount() const
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 return polygons_.size();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
710 }
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 const StructurePolygon& GetPolygon(size_t i) const
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 if (i >= polygons_.size())
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
715 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
716 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
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 else
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 assert(polygons_[i] != NULL);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
721 return *polygons_[i];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
722 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
723 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
724
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
725 bool HasFrameOfReferenceUid() const
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
726 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
727 return hasFrameOfReferenceUid_;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
728 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
729
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
730 const std::string& GetFrameOfReferenceUid() const
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
731 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
732 if (hasFrameOfReferenceUid_)
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
733 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
734 return frameOfReferenceUid_;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
735 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
736 else
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
737 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
738 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
739 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
740 }
1
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
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
744 class StructureSetGeometry : public boost::noncopyable
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
745 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
746 private:
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
747 bool strict_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
748 Vector3D slicesNormal_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
749 double slicesSpacing_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
750 double minProjectionAlongNormal_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
751 double maxProjectionAlongNormal_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
752 size_t slicesCount_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
753
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
754 static bool AreNormalsParallel(const Vector3D& a,
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
755 const Vector3D& b)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
756 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
757 return IsNear(std::abs(Vector3D::DotProduct(a, b)), 1);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
758 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
759
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
760 bool LookupProjectionIndex(size_t& index,
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
761 double z) const
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
762 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
763 if (slicesCount_ == 0)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
764 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
765 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
766 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
767
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
768 if (z < minProjectionAlongNormal_ ||
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
769 z > maxProjectionAlongNormal_)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
770 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
771 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
772 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
773
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
774 assert(slicesSpacing_ > 0 &&
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
775 minProjectionAlongNormal_ < maxProjectionAlongNormal_);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
776
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
777 double d = (z - minProjectionAlongNormal_) / slicesSpacing_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
778
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
779 if (IsNear(d, round(d)))
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
780 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
781 if (d < 0.0 ||
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
782 d > static_cast<double>(slicesCount_) - 1.0)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
783 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
784 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
785 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
786 else
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
787 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
788 index = static_cast<size_t>(round(d));
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
789 return true;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
790 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
791 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
792 else
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
793 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
794 return false;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
795 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
796 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
797
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
798 public:
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
799 StructureSetGeometry(const StructureSet& structures,
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
800 bool strict) :
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
801 strict_(strict)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
802 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
803 bool isValid = false;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
804
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
805 std::vector<double> projections;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
806 projections.reserve(structures.GetPolygonsCount());
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
807
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
808 for (size_t i = 0; i < structures.GetPolygonsCount(); i++)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
809 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
810 Vector3D normal;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
811 if (structures.GetPolygon(i).IsCoplanar(normal))
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
812 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
813 // Initialize the normal of the whole volume, if need be
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
814 if (!isValid)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
815 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
816 isValid = true;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
817 slicesNormal_ = normal;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
818 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
819
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
820 if (AreNormalsParallel(normal, slicesNormal_))
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
821 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
822 // This is a valid slice (it is parallel to the normal)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
823 const Vector3D& point = structures.GetPolygon(i).GetPoint(0);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
824 projections.push_back(Vector3D::DotProduct(point, slicesNormal_));
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
825 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
826 else
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
827 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
828 // RT-STRUCT with non-parallel slices
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
829 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
830 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
831 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
832 else
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
833 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
834 // Ignore slices that are not coplanar
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
835 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
836 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
837
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
838 if (projections.empty())
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
839 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
840 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented,
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
841 "Structure set without a valid geometry");
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
842 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
843
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
844 // Only keep unique projections
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
845
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
846 std::sort(projections.begin(), projections.end());
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
847 RemoveDuplicateValues(projections);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
848 assert(!projections.empty());
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
849
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
850 if (projections.size() == 1)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
851 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
852 // Volume with one single slice
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
853 minProjectionAlongNormal_ = projections[0];
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
854 maxProjectionAlongNormal_ = projections[0];
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
855 slicesSpacing_ = 1; // Arbitrary value
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
856 slicesCount_ = 1;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
857 return;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
858 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
859
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
860
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
861 // Compute the most probable spacing between the slices
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
862
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
863 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
864 std::vector<double> spacings;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
865 spacings.resize(projections.size() - 1);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
866
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
867 for (size_t i = 0; i < spacings.size(); i++)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
868 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
869 spacings[i] = projections[i + 1] - projections[i];
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
870 assert(spacings[i] > 0);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
871 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
872
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
873 std::sort(spacings.begin(), spacings.end());
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
874 RemoveDuplicateValues(spacings);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
875
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
876 if (spacings.empty())
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
877 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
878 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
879 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
880
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
881 slicesSpacing_ = spacings[spacings.size() / 10]; // Take the 90% percentile of smallest spacings
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
882 assert(slicesSpacing_ > 0);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
883 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
884
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
885
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
886 // Find the projection along the normal with the largest support
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
887
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
888 bool first = true;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
889 size_t bestSupport;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
890 double bestProjection;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
891
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
892 std::list<size_t> candidates;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
893 for (size_t i = 0; i < projections.size(); i++)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
894 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
895 candidates.push_back(i);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
896 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
897
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
898 while (!candidates.empty())
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
899 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
900 std::list<size_t> next;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
901
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
902 size_t countSupport = 0;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
903
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
904 std::list<size_t>::const_iterator it = candidates.begin();
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
905 size_t reference = *it;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
906 it++;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
907
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
908 while (it != candidates.end())
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
909 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
910 double d = (projections[*it] - projections[reference]) / slicesSpacing_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
911 if (IsNear(d, round(d)))
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
912 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
913 countSupport ++;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
914 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
915 else
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
916 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
917 next.push_back(*it);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
918 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
919
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
920 it++;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
921 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
922
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
923 if (first ||
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
924 countSupport > bestSupport)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
925 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
926 first = false;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
927 bestSupport = countSupport;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
928 bestProjection = projections[reference];
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
929 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
930
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
931 if (strict &&
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
932 !next.empty())
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
933 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
934 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat,
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
935 "Structure set with multiple support, which is not allowed in Strict mode");
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
936 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
937
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
938 candidates.swap(next);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
939 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
940
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
941
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
942 // Compute the range of the projections
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
943
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
944 minProjectionAlongNormal_ = bestProjection;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
945 maxProjectionAlongNormal_ = bestProjection;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
946
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
947 for (size_t i = 0; i < projections.size(); i++)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
948 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
949 double d = (projections[i] - bestProjection) / slicesSpacing_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
950 if (IsNear(d, round(d)))
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
951 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
952 minProjectionAlongNormal_ = std::min(minProjectionAlongNormal_, projections[i]);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
953 maxProjectionAlongNormal_ = std::max(maxProjectionAlongNormal_, projections[i]);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
954 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
955 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
956
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
957 double d = (maxProjectionAlongNormal_ - minProjectionAlongNormal_) / slicesSpacing_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
958 if (IsNear(d, round(d)))
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
959 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
960 slicesCount_ = static_cast<size_t>(round(d)) + 1;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
961 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
962 else
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
963 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
964 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
965 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
966
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
967
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
968 // Sanity check
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
969
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
970 size_t a, b;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
971 if (!LookupProjectionIndex(a, minProjectionAlongNormal_) ||
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
972 !LookupProjectionIndex(b, maxProjectionAlongNormal_) ||
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
973 a != 0 ||
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
974 b + 1 != slicesCount_)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
975 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
976 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
977 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
978 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
979
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
980 const Vector3D& GetSlicesNormal() const
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
981 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
982 return slicesNormal_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
983 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
984
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
985 double GetSlicesSpacing() const
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
986 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
987 return slicesSpacing_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
988 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
989
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
990 double GetMinProjectionAlongNormal() const
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
991 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
992 return minProjectionAlongNormal_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
993 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
994
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
995 double GetMaxProjectionAlongNormal() const
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
996 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
997 return maxProjectionAlongNormal_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
998 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
999
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1000 bool ProjectAlongNormal(double& z,
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1001 const StructurePolygon& polygon) const
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1002 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1003 Vector3D normal;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1004 if (polygon.IsCoplanar(normal) &&
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1005 AreNormalsParallel(normal, slicesNormal_))
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1006 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1007 z = Vector3D::DotProduct(polygon.GetPoint(0), slicesNormal_);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1008 return true;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1009 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1010 else
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1011 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1012 return false;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1013 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1014 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1015
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1016 size_t GetSlicesCount() const
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1017 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1018 return slicesCount_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1019 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1020
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1021 bool LookupSliceIndex(size_t& slice,
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1022 const StructurePolygon& polygon) const
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1023 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1024 double z;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1025 return (ProjectAlongNormal(z, polygon) &&
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1026 LookupProjectionIndex(slice, z));
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1027 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1028 };
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1029
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1030
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1031
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 class XorFiller : public Orthanc::ImageProcessing::IPolygonFiller
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1034 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1035 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1036 Orthanc::ImageAccessor& target_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1037
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1038 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1039 XorFiller(Orthanc::ImageAccessor& target) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1040 target_(target)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1041 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1042 }
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 virtual void Fill(int y,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1045 int x1,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1046 int x2) ORTHANC_OVERRIDE
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1047 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1048 assert(x1 <= x2);
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 if (y >= 0 &&
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1051 y < static_cast<int>(target_.GetHeight()))
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1052 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1053 x1 = std::max(x1, 0);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1054 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
1055
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1056 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
1057
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1058 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
1059 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1060 *p = (*p ^ 0xff);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1061 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1062 }
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 };
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1065
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1066
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1067 static void EncodeSTL(std::string& target /* out */,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1068 vtkPolyData& mesh /* in */)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1069 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1070 // 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
1071
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1072 Orthanc::ChunkedBuffer buffer;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1073
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1074 uint8_t header[80];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1075 memset(header, 0, sizeof(header));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1076 buffer.AddChunk(header, sizeof(header));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1077
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1078 uint32_t n = mesh.GetNumberOfCells();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1079 buffer.AddChunk(&n, sizeof(n));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1080
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1081 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
1082 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1083 vtkCell* cell = mesh.GetCell(i);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1084 vtkTriangle* triangle = dynamic_cast<vtkTriangle*>(cell);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1085
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1086 double p0[3];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1087 double p1[3];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1088 double p2[3];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1089 triangle->GetPoints()->GetPoint(0, p0);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1090 triangle->GetPoints()->GetPoint(1, p1);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1091 triangle->GetPoints()->GetPoint(2, p2);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1092
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1093 double normal[3];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1094 vtkTriangle::ComputeNormal(p0, p1, p2, normal);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1095
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1096 float d[4 * 3] = {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1097 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
1098 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
1099 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
1100 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
1101 buffer.AddChunk(d, sizeof(d));
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 uint16_t a = 0;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1104 buffer.AddChunk(&a, sizeof(a));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1105 }
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 buffer.Flatten(target);
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
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1111 bool EncodeVolume(std::string& stl,
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1112 vtkImageData* volume,
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1113 unsigned int resolution,
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1114 bool smooth)
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1115 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1116 if (volume == NULL)
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1117 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1118 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1119 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1120
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1121 vtkNew<vtkImageResize> resize;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1122 resize->SetOutputDimensions(resolution, resolution, resolution);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1123 resize->SetInputData(volume);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1124 resize->Update();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1125
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1126 vtkNew<vtkImageConstantPad> padding;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1127 padding->SetConstant(0);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1128 padding->SetOutputNumberOfScalarComponents(1);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1129 padding->SetOutputWholeExtent(-1, resolution, -1, resolution, -1, resolution);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1130 padding->SetInputData(resize->GetOutput());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1131 padding->Update();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1132
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1133 double range[2];
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1134 padding->GetOutput()->GetScalarRange(range);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1135
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1136 const double isoValue = (range[0] + range[1]) / 2.0;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1137
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1138 vtkNew<vtkMarchingCubes> surface;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1139 surface->SetInputData(padding->GetOutput());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1140 surface->ComputeNormalsOn();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1141 surface->SetValue(0, isoValue);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1142 surface->Update();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1143
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1144 if (smooth)
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1145 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1146 vtkNew<vtkSmoothPolyDataFilter> smoothFilter;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1147 // Apply volume smoothing
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1148 // https://examples.vtk.org/site/Cxx/PolyData/SmoothPolyDataFilter/
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1149 smoothFilter->SetInputConnection(surface->GetOutputPort());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1150 smoothFilter->SetNumberOfIterations(15);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1151 smoothFilter->SetRelaxationFactor(0.1);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1152 smoothFilter->FeatureEdgeSmoothingOff();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1153 smoothFilter->BoundarySmoothingOn();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1154 smoothFilter->Update();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1155
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1156 vtkNew<vtkPolyDataNormals> normalGenerator;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1157 normalGenerator->SetInputConnection(smoothFilter->GetOutputPort());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1158 normalGenerator->ComputePointNormalsOn();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1159 normalGenerator->ComputeCellNormalsOn();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1160 normalGenerator->Update();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1161
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1162 EncodeSTL(stl, *normalGenerator->GetOutput());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1163 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1164 else
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1165 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1166 EncodeSTL(stl, *surface->GetOutput());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1167 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1168
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1169 return true;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1170 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1171
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1172
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1173 bool EncodeStructureSetMesh(std::string& stl,
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1174 const StructureSet& structureSet,
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1175 const StructureSetGeometry& geometry,
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1176 const std::set<std::string>& roiNames,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1177 unsigned int resolution,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1178 bool smooth)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1179 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1180 if (resolution < 1)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1181 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1182 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
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
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1185 if (!IsNear(1, geometry.GetSlicesNormal().ComputeNorm()))
1
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_InternalError);
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1190 // 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
1191 Vector3D axisX(1, 0, 0);
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1192 Vector3D axisY = Vector3D::CrossProduct(geometry.GetSlicesNormal(), axisX);
1
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 if (!IsNear(1, axisX.ComputeNorm()) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1195 !IsNear(1, axisY.ComputeNorm()))
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_InternalError);
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1200 Extent2D extent;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1201 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
1202 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1203 structureSet.GetPolygon(i).Add(extent, axisX, axisY);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1204 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1205
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1206 const int depth = geometry.GetSlicesCount();
1
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 vtkNew<vtkImageData> volume;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1209 volume->SetDimensions(resolution, resolution, depth);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1210 volume->AllocateScalars(VTK_UNSIGNED_CHAR, 1);
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 assert(sizeof(unsigned char) == 1);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1213 memset(volume->GetScalarPointer(), 0, resolution * resolution * depth);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1214
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1215 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
1216 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1217 const StructurePolygon& polygon = structureSet.GetPolygon(i);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1218 if (roiNames.find(polygon.GetRoiName()) == roiNames.end())
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1219 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1220 // 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
1221 continue;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1222 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1223
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1224 size_t j;
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1225 if (!geometry.LookupSliceIndex(j, polygon))
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1226 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1227 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1228 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1229
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1230 std::vector<Orthanc::ImageProcessing::ImagePoint> points;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1231 points.reserve(polygon.GetPointsCount());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1232 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
1233 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1234 const Vector3D& point = polygon.GetPoint(j);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1235 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
1236 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
1237 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
1238 static_cast<int32_t>(std::floor(y))));
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1241 Orthanc::ImageAccessor slice;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1242 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
1243 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
1244
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1245 XorFiller filler(slice);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1246 Orthanc::ImageProcessing::FillPolygon(filler, points);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1247 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1248
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1249 volume->SetSpacing(
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1250 extent.GetWidth() / static_cast<double>(resolution),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1251 extent.GetHeight() / static_cast<double>(resolution),
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1252 (geometry.GetMaxProjectionAlongNormal() - geometry.GetMinProjectionAlongNormal()) / static_cast<double>(depth));
1
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 // TODO
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1255 // volume->SetOrigin()
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1256
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1257 return EncodeVolume(stl, volume.Get(), resolution, smooth);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1258 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1259
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1260
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1261 static Orthanc::ParsedDicomFile* LoadInstance(const std::string& instanceId)
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1262 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1263 std::string dicom;
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1264
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1265 if (!OrthancPlugins::RestApiGetString(dicom, "/instances/" + instanceId + "/file", false))
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1266 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1267 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1268 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1269 else
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1270 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1271 return new Orthanc::ParsedDicomFile(dicom);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1272 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1273 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1274
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1275
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1276 void ListStructures(OrthancPluginRestOutput* output,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1277 const char* url,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1278 const OrthancPluginHttpRequest* request)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1279 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1280 if (request->method != OrthancPluginHttpMethod_Get)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1281 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1282 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "GET");
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1283 return;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1284 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1285
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1286 const std::string instanceId(request->groups[0]);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1287
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1288 std::unique_ptr<Orthanc::ParsedDicomFile> dicom(LoadInstance(instanceId));
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1289
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1290 std::set<std::string> names;
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1291 ListStructuresNames(names, *dicom);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1292
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1293 Json::Value answer = Json::arrayValue;
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1294
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1295 for (std::set<std::string>::const_iterator it = names.begin(); it != names.end(); ++it)
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1296 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1297 answer.append(*it);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1298 }
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1299
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1300 std::string s = answer.toStyledString();
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1301 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, s.c_str(), s.size(), Orthanc::MIME_JSON);
1
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1304
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1305 static void AddDefaultTagValue(Json::Value& target,
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1306 const Orthanc::DicomTag& tag,
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1307 const std::string& value)
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1308 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1309 if (!target.isMember(tag.Format()))
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1310 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1311 target[tag.Format()] = value;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1312 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1313 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1314
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1315
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1316 static void AddDefaultTagValue(Json::Value& target,
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1317 const DcmTagKey& tag,
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1318 const std::string& value)
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1319 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1320 AddDefaultTagValue(target, Orthanc::DicomTag(tag.getGroup(), tag.getElement()), value);
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1321 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1322
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1323
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1324 static void CallCreateDicom(Json::Value& answer,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1325 const std::string& stl,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1326 const Json::Value& body,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1327 const std::string& parentStudy,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1328 const std::string& defaultSeriesDescription,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1329 const std::string& defaultFrameOfReferenceUid,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1330 const std::string& defaultTitle)
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1331 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1332 static const char* const KEY_TAGS = "Tags";
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1333
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1334 Json::Value normalized = Json::objectValue;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1335
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1336 if (body.isMember(KEY_TAGS))
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1337 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1338 const Json::Value& tags = body[KEY_TAGS];
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1339
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1340 if (tags.type() != Json::objectValue)
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1341 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1342 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest, "Tags must be provided as a JSON object");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1343 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1344
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1345 std::vector<std::string> keys = tags.getMemberNames();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1346 for (size_t i = 0; i < keys.size(); i++)
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1347 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1348 const Orthanc::DicomTag tag = Orthanc::FromDcmtkBridge::ParseTag(keys[i]);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1349 normalized[tag.Format()] = tags[keys[i]];
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1350 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1351 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1352
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1353 if (!normalized.isMember(Orthanc::DICOM_TAG_SERIES_DESCRIPTION.Format()))
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1354 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1355 normalized[Orthanc::DICOM_TAG_SERIES_DESCRIPTION.Format()] = defaultSeriesDescription;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1356 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1357
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1358 AddDefaultTagValue(normalized, Orthanc::DICOM_TAG_SERIES_NUMBER, "1");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1359 AddDefaultTagValue(normalized, Orthanc::DICOM_TAG_FRAME_OF_REFERENCE_UID, defaultFrameOfReferenceUid);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1360 AddDefaultTagValue(normalized, Orthanc::DICOM_TAG_INSTANCE_NUMBER, "1");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1361
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1362 AddDefaultTagValue(normalized, DCM_BurnedInAnnotation, "NO");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1363 AddDefaultTagValue(normalized, DCM_DeviceSerialNumber, ORTHANC_STL_VERSION);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1364 AddDefaultTagValue(normalized, DCM_DocumentTitle, defaultTitle);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1365 AddDefaultTagValue(normalized, DCM_Manufacturer, "Orthanc STL plugin");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1366 AddDefaultTagValue(normalized, DCM_ManufacturerModelName, "Orthanc STL plugin");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1367 AddDefaultTagValue(normalized, DCM_PositionReferenceIndicator, "");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1368 AddDefaultTagValue(normalized, DCM_SoftwareVersions, ORTHANC_STL_VERSION);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1369 AddDefaultTagValue(normalized, DCM_ConceptNameCodeSequence, "");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1370
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1371 std::string date, time;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1372 Orthanc::SystemToolbox::GetNowDicom(date, time, true /* use UTC time (not local time) */);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1373 AddDefaultTagValue(normalized, DCM_AcquisitionDateTime, date + time);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1374
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1375 const Orthanc::DicomTag MEASUREMENT_UNITS_CODE_SEQUENCE(DCM_MeasurementUnitsCodeSequence.getGroup(),
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1376 DCM_MeasurementUnitsCodeSequence.getElement());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1377
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1378 if (!normalized.isMember(MEASUREMENT_UNITS_CODE_SEQUENCE.Format()))
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1379 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1380 Json::Value item;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1381 item["CodeValue"] = "mm";
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1382 item["CodingSchemeDesignator"] = "UCUM";
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1383 item["CodeMeaning"] = defaultTitle;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1384
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1385 normalized[MEASUREMENT_UNITS_CODE_SEQUENCE.Format()].append(item);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1386 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1387
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1388 std::string content;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1389 Orthanc::Toolbox::EncodeDataUriScheme(content, Orthanc::MIME_STL, stl);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1390
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1391 Json::Value create;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1392 create["Content"] = content;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1393 create["Parent"] = parentStudy;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1394 create["Tags"] = normalized;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1395
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1396 if (!OrthancPlugins::RestApiPost(answer, "/tools/create-dicom", create.toStyledString(), false))
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1397 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1398 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest, "Cannot create DICOM from STL");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1399 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1400 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1401
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1402
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1403 void EncodeStructureSet(OrthancPluginRestOutput* output,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1404 const char* url,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1405 const OrthancPluginHttpRequest* request)
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1406 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1407 static const char* const KEY_INSTANCE = "Instance";
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1408 static const char* const KEY_RESOLUTION = "Resolution";
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1409 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
1410 static const char* const KEY_SMOOTH = "Smooth";
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1411 static const char* const KEY_STRICT = "Strict";
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1412
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1413 if (request->method != OrthancPluginHttpMethod_Post)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1414 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1415 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "POST");
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1416 return;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1417 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1418
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1419 Json::Value body;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1420 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
1421 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1422 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1423 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1424
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1425 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
1426 const bool smooth = (body.isMember(KEY_SMOOTH) ?
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1427 Orthanc::SerializationToolbox::ReadBoolean(body, KEY_SMOOTH) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1428 true /* smooth by default */);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1429 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
1430 Orthanc::SerializationToolbox::ReadUnsignedInteger(body, KEY_RESOLUTION) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1431 256 /* default value */);
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1432 const bool strict = (body.isMember(KEY_STRICT) ?
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1433 Orthanc::SerializationToolbox::ReadBoolean(body, KEY_STRICT) :
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1434 true /* strict by default */);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1435
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1436 std::set<std::string> roiNames;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1437 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
1438
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1439 std::unique_ptr<Orthanc::ParsedDicomFile> dicom(LoadInstance(instanceId));
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1440
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1441 StructureSet structureSet(*dicom);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1442
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1443 StructureSetGeometry geometry(structureSet, strict);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1444
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1445 std::string stl;
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1446 if (!EncodeStructureSetMesh(stl, structureSet, geometry, roiNames, resolution, smooth))
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1447 {
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1448 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Cannot encode STL from RT-STRUCT");
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1449 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1450 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1451 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1452 std::string seriesDescription;
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1453
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1454 if (dicom->GetTagValue(seriesDescription, Orthanc::DICOM_TAG_SERIES_DESCRIPTION))
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1455 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1456 seriesDescription += ": ";
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1457 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1458 else
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1459 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1460 seriesDescription.clear();
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1461 }
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1462
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1463 bool first = true;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1464 for (std::set<std::string>::const_iterator it = roiNames.begin(); it != roiNames.end(); ++it)
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1465 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1466 if (first)
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1467 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1468 first = false;
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1469 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1470 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1471 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1472 seriesDescription += ", ";
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1473 }
2
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1474
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1475 seriesDescription += *it;
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1476 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1477
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1478 std::string frameOfReferenceUid;
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1479 if (structureSet.HasFrameOfReferenceUid())
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1480 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1481 frameOfReferenceUid = structureSet.GetFrameOfReferenceUid();
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1482 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1483 else
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1484 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1485 frameOfReferenceUid = Orthanc::FromDcmtkBridge::GenerateUniqueIdentifier(Orthanc::ResourceType_Instance);
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1486 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1487
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1488 Json::Value answer;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1489 CallCreateDicom(answer, stl, body, structureSet.HashStudy(), seriesDescription,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1490 frameOfReferenceUid, "STL model generated from DICOM RT-STRUCT");
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1491
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1492 std::string s = answer.toStyledString();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1493 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, s.c_str(), s.size(), Orthanc::MIME_JSON);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1494 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1495 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1496
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1497
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1498 void ExtractStl(OrthancPluginRestOutput* output,
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1499 const char* url,
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1500 const OrthancPluginHttpRequest* request)
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1501 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1502 if (request->method != OrthancPluginHttpMethod_Get)
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1503 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1504 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "GET");
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1505 return;
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1506 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1507
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1508 const std::string instanceId(request->groups[0]);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1509
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1510 std::unique_ptr<Orthanc::ParsedDicomFile> dicom(LoadInstance(instanceId));
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1511 DcmDataset& dataset = *dicom->GetDcmtkObject().getDataset();
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1512
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1513 std::string stl;
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1514 if (GetStringValue(dataset, DCM_MIMETypeOfEncapsulatedDocument) != Orthanc::MIME_STL ||
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1515 GetStringValue(dataset, DCM_SOPClassUID) != STL_SOP_CLASS_UID ||
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1516 !dicom->GetTagValue(stl, Orthanc::DICOM_TAG_ENCAPSULATED_DOCUMENT))
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1517 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1518 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest, "DICOM instance not encapsulating a STL model: " + instanceId);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1519 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1520 else
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1521 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1522 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output,
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1523 stl.empty() ? NULL : stl.c_str(), stl.size(), Orthanc::MIME_STL);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1524 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1525 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1526
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1527
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1528
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1529 class NiftiHeader : public boost::noncopyable
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1530 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1531 private:
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1532 nifti_image* image_;
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1533
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1534 public:
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1535 NiftiHeader(const std::string& nifti)
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1536 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1537 nifti_1_header header;
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1538 if (nifti.size() < sizeof(header))
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1539 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1540 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1541 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1542
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1543 memcpy(&header, nifti.c_str(), sizeof(header));
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1544 if (!nifti_hdr_looks_good(&header))
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1545 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1546 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1547 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1548
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1549 image_ = nifti_convert_nhdr2nim(header, "dummy_filename");
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1550 if (image_ == NULL)
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1551 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1552 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1553 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1554 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1555
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1556 ~NiftiHeader()
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1557 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1558 nifti_image_free(image_);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1559 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1560
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1561 const nifti_image& GetInfo() const
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1562 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1563 assert(image_ != NULL);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1564 return *image_;
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1565 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1566 };
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1567
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1568
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1569 static void LoadNifti(vtkImageData* volume,
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1570 std::string& nifti)
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1571 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1572 if (volume == NULL)
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1573 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1574 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1575 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1576
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1577 const uint8_t* p = reinterpret_cast<const uint8_t*>(nifti.c_str());
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1578
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1579 if (nifti.size() >= 2 &&
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1580 p[0] == 0x1f &&
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1581 p[1] == 0x8b)
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1582 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1583 Orthanc::GzipCompressor compressor;
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1584 std::string uncompressed;
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1585 Orthanc::IBufferCompressor::Uncompress(uncompressed, compressor, nifti);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1586 nifti.swap(uncompressed);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1587 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1588
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1589 NiftiHeader header(nifti);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1590
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1591 if (header.GetInfo().ndim != 3)
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1592 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1593 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat,
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1594 "Only 3D NIfTI volumes are allowed");
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1595 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1596
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1597 size_t itemSize;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1598 int vtkType;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1599
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1600 switch (header.GetInfo().datatype)
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1601 {
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1602 case DT_UNSIGNED_CHAR:
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1603 itemSize = 1;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1604 vtkType = VTK_UNSIGNED_CHAR;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1605 break;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1606
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1607 case DT_FLOAT:
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1608 itemSize = sizeof(float);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1609 vtkType = VTK_FLOAT;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1610 break;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1611
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1612 case DT_DOUBLE:
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1613 itemSize = sizeof(double);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1614 vtkType = VTK_DOUBLE;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1615 break;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1616
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1617 default:
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1618 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1619 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1620
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1621 assert(static_cast<int>(header.GetInfo().nvox) == header.GetInfo().nx * header.GetInfo().ny * header.GetInfo().nz);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1622
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1623 const size_t pixelDataOffset = sizeof(nifti_1_header) + 4 /* extension */;
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1624
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1625 if (nifti.size() != pixelDataOffset + header.GetInfo().nvox * itemSize)
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1626 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1627 throw Orthanc::OrthancException(Orthanc::ErrorCode_CorruptedFile);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1628 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1629
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1630 volume->SetDimensions(header.GetInfo().nx, header.GetInfo().ny, header.GetInfo().nz);
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1631 volume->AllocateScalars(vtkType, 1);
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1632 volume->SetSpacing(header.GetInfo().dx, header.GetInfo().dy, header.GetInfo().dz);
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1633 memcpy(volume->GetScalarPointer(), &nifti[pixelDataOffset], header.GetInfo().nvox * itemSize);
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1634 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1635
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1636
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1637 void EncodeNifti(OrthancPluginRestOutput* output,
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1638 const char* url,
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1639 const OrthancPluginHttpRequest* request)
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1640 {
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1641 static const char* const KEY_NIFTI = "Nifti";
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1642 static const char* const KEY_RESOLUTION = "Resolution";
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1643 static const char* const KEY_PARENT_STUDY = "ParentStudy";
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1644 static const char* const KEY_SMOOTH = "Smooth";
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1645
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1646 if (request->method != OrthancPluginHttpMethod_Post)
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1647 {
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1648 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "POST");
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1649 return;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1650 }
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1651
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1652 Json::Value body;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1653 if (!Orthanc::Toolbox::ReadJson(body, request->body, request->bodySize))
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1654 {
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1655 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1656 }
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1657
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1658 std::string mime, nifti;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1659 if (!Orthanc::Toolbox::DecodeDataUriScheme(mime, nifti, Orthanc::SerializationToolbox::ReadString(body, KEY_NIFTI)))
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1660 {
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1661 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest, "Missing the \"Nifti\" argument containing the NIfTI file");
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1662 }
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1663
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1664 const std::string parentStudy = Orthanc::SerializationToolbox::ReadString(body, KEY_PARENT_STUDY);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1665 const bool smooth = (body.isMember(KEY_SMOOTH) ?
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1666 Orthanc::SerializationToolbox::ReadBoolean(body, KEY_SMOOTH) :
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1667 true /* smooth by default */);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1668 const unsigned int resolution = (body.isMember(KEY_RESOLUTION) ?
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1669 Orthanc::SerializationToolbox::ReadUnsignedInteger(body, KEY_RESOLUTION) :
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1670 256 /* default value */);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1671
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1672 vtkNew<vtkImageData> volume;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1673 LoadNifti(volume.Get(), nifti);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1674
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1675 std::string stl;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1676 if (!EncodeVolume(stl, volume.Get(), resolution, smooth))
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1677 {
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1678 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Cannot encode STL from NIfTI");
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1679 }
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1680 else
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1681 {
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1682 const std::string title = "STL model generated from NIfTI";
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1683
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1684 const std::string frameOfReferenceUid = Orthanc::FromDcmtkBridge::GenerateUniqueIdentifier(Orthanc::ResourceType_Instance);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1685
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1686 Json::Value answer;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1687 CallCreateDicom(answer, stl, body, parentStudy, title, frameOfReferenceUid, title);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1688
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1689 std::string s = answer.toStyledString();
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1690 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, s.c_str(), s.size(), Orthanc::MIME_JSON);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1691 }
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1692 }
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1693
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1694
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1695 extern "C"
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1696 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1697 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1698 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1699 OrthancPlugins::SetGlobalContext(context);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1700
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1701 /* Check the version of the Orthanc core */
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1702 if (OrthancPluginCheckVersion(OrthancPlugins::GetGlobalContext()) == 0)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1703 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1704 char info[1024];
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1705 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
1706 OrthancPlugins::GetGlobalContext()->orthancVersion,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1707 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1708 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1709 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1710 OrthancPluginLogError(OrthancPlugins::GetGlobalContext(), info);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1711 return -1;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1712 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1713
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1714 #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
1715 Orthanc::Logging::InitializePluginContext(context);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1716 #else
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1717 Orthanc::Logging::Initialize(context);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1718 #endif
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1719
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1720 Orthanc::InitializeFramework("", false);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1721
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1722 hasCreateDicomStl_ = OrthancPlugins::CheckMinimalOrthancVersion(1, 12, 1);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1723
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1724 if (!hasCreateDicomStl_)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1725 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1726 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
1727 << ") 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
1728 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1729
25
5fc3ea6acbd5 fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 24
diff changeset
1730 OrthancPlugins::SetDescription(ORTHANC_PLUGIN_NAME, "STL plugin for Orthanc.");
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1731
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1732 OrthancPlugins::RegisterRestCallback<ServeFile>("/stl/app/(.*)", true);
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1733 OrthancPlugins::RegisterRestCallback<ExtractStl>("/instances/([0-9a-f-]+)/stl", true);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1734 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
1735
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1736 if (hasCreateDicomStl_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1737 {
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1738 OrthancPlugins::RegisterRestCallback<EncodeStructureSet>("/stl/encode-rtstruct", true);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1739 OrthancPlugins::RegisterRestCallback<EncodeNifti>("/stl/encode-nifti", true);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1740 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1741
2
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1742 // 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
1743 std::string explorer;
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1744
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1745 {
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1746 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
1747
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1748 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
1749 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
1750 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
1751
25
5fc3ea6acbd5 fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 24
diff changeset
1752 OrthancPlugins::ExtendOrthancExplorer(ORTHANC_PLUGIN_NAME, explorer);
2
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1753 }
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1754
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1755 return 0;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1756 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1757
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1758
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1759 ORTHANC_PLUGINS_API void OrthancPluginFinalize()
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1760 {
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1761 Orthanc::FinalizeFramework();
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1762 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1763
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1764
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1765 ORTHANC_PLUGINS_API const char* OrthancPluginGetName()
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1766 {
25
5fc3ea6acbd5 fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 24
diff changeset
1767 return ORTHANC_PLUGIN_NAME;
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1768 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1769
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1770
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1771 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion()
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1772 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1773 return ORTHANC_STL_VERSION;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1774 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1775 }