annotate Sources/Plugin.cpp @ 29:62abf3c523f9

big endian support, retrieve axes from referenced volume
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 04 Apr 2024 16:29:01 +0200
parents 410003c50b17
children 3570c23764d4
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
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
56
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 // Forward declaration
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 void ReadStaticAsset(std::string& target,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 const std::string& path);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61
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 * 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
64 * "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
65 * 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
66 **/
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 class ResourcesCache : public boost::noncopyable
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 private:
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 typedef std::map<std::string, std::string*> Content;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 boost::shared_mutex mutex_;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 Content content_;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 public:
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 ~ResourcesCache()
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 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
79 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 assert(it->second != NULL);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 delete it->second;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 }
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 void Answer(OrthancPluginRestOutput* output,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 const std::string& path)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 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
89
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 // Check whether the cache already contains the resource
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 boost::shared_lock<boost::shared_mutex> lock(mutex_);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 Content::const_iterator found = content_.find(path);
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 if (found != content_.end())
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 assert(found->second != NULL);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 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
100 return;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 // This resource has not been cached yet
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 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
107 ReadStaticAsset(*item, path);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 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
109
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 // Store the resource into the cache
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 boost::unique_lock<boost::shared_mutex> lock(mutex_);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114 if (content_.find(path) == content_.end())
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 content_[path] = item.release();
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 }
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 static ResourcesCache cache_;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 static bool hasCreateDicomStl_;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 void ServeFile(OrthancPluginRestOutput* output,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 const char* url,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 const OrthancPluginHttpRequest* request)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 {
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
130 if (request->method != OrthancPluginHttpMethod_Get)
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
131 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
132 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "GET");
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
133 return;
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
134 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
135
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 std::string file = request->groups[0];
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 if (file == "viewer.html")
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 std::string s;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 Orthanc::EmbeddedResources::GetFileResource(s, Orthanc::EmbeddedResources::VIEWER_HTML);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142 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
143 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 else if (file == "viewer.js")
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 std::string s;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 Orthanc::EmbeddedResources::GetFileResource(s, Orthanc::EmbeddedResources::VIEWER_JS);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 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
149 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 else
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 cache_.Answer(output, file);
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 }
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
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
157
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
158
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
159 #include <dcmtk/dcmdata/dcdeftag.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
160 #include <dcmtk/dcmdata/dcfilefo.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
161 #include <dcmtk/dcmdata/dcitem.h>
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
162 #include <dcmtk/dcmdata/dcsequen.h>
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
163 #include <dcmtk/dcmdata/dcuid.h>
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
164
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
165 class Extent2D : public boost::noncopyable
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
166 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
167 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
168 bool isEmpty_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
169 double x1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
170 double y1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
171 double x2_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
172 double y2_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
173
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
174 void CheckNotEmpty() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
175 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
176 if (isEmpty_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
177 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
178 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
179 }
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 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
183 Extent2D() :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
184 isEmpty_(true),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
185 x1_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
186 y1_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
187 x2_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
188 y2_(0)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
189 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
190 }
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 bool IsEmpty() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
193 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
194 return isEmpty_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
195 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
196
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
197 double GetMinX() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
198 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
199 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
200 return x1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
201 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
202
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
203 double GetMaxX() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
204 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
205 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
206 return x2_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
207 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
208
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
209 double GetMinY() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
210 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
211 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
212 return y1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
213 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
214
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
215 double GetMaxY() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
216 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
217 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
218 return y2_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
219 }
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 double GetWidth() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
222 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
223 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
224 return x2_ - x1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
225 }
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 double GetHeight() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
228 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
229 CheckNotEmpty();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
230 return y2_ - y1_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
231 }
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 void Add(double x,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
234 double y)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
235 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
236 if (isEmpty_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
237 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
238 x1_ = x2_ = x;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
239 y1_ = y2_ = y;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
240 isEmpty_ = false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
241 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
242 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
243 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
244 x1_ = std::min(x1_, x);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
245 x2_ = std::max(x2_, x);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
246 y1_ = std::min(y1_, y);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
247 y2_ = std::max(y2_, y);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
248 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
249 }
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
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
252 static std::string GetStringValue(DcmItem& item,
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
253 const DcmTagKey& key)
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
254 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
255 const char* s = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
256 if (!item.findAndGetString(key, s).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
257 s == NULL)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
258 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
259 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
260 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
261 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
262 {
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
263 return Orthanc::Toolbox::StripSpaces(s);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
264 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
265 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
266
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 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
269 Orthanc::ParsedDicomFile& source)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
270 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
271 target.clear();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
272
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
273 DcmSequenceOfItems* sequence = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
274 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
275 sequence == NULL)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
276 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
277 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
278 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
279
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
280 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
281 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
282 DcmItem* item = sequence->getItem(i);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
283 if (item == NULL)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
284 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
285 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
286 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
287 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
288 {
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
289 target.insert(GetStringValue(*item, DCM_ROIName));
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
290 }
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 static bool IsNear(double a,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
296 double b)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
297 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
298 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
299 }
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 class Vector3D
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
303 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
304 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
305 double x_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
306 double y_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
307 double z_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
308
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
309 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
310 Vector3D() :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
311 x_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
312 y_(0),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
313 z_(0)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
314 {
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 Vector3D(double x,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
318 double y,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
319 double z) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
320 x_(x),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
321 y_(y),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
322 z_(z)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
323 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
324 }
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 Vector3D(const Vector3D& from,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
327 const Vector3D& to) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
328 x_(to.x_ - from.x_),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
329 y_(to.y_ - from.y_),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
330 z_(to.z_ - from.z_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
331 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
332 }
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 double GetX() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
335 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
336 return x_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
337 }
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 double GetY() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
340 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
341 return y_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
342 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
343
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
344 double GetZ() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
345 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
346 return z_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
347 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
348
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
349 double ComputeSquaredNorm() const
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
350 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
351 return x_ * x_ + y_ * y_ + z_ * z_;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
352 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
353
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
354 double ComputeNorm() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
355 {
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
356 return sqrt(ComputeSquaredNorm());
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
357 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
358
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
359 void Normalize()
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
360 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
361 double norm = ComputeNorm();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
362 if (!IsNear(norm, 0))
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 x_ /= norm;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
365 y_ /= norm;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
366 z_ /= norm;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
367 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
368 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
369
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
370 static Vector3D CrossProduct(const Vector3D& u,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
371 const Vector3D& v)
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 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
374 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
375 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
376 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
377
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
378 static double DotProduct(const Vector3D& a,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
379 const Vector3D& b)
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 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
382 }
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
383
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
384 static bool AreParallel(const Vector3D& a,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
385 const Vector3D& b)
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
386 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
387 if (IsNear(a.ComputeSquaredNorm(), 1) &&
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
388 IsNear(b.ComputeSquaredNorm(), 1))
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
389 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
390 return IsNear(std::abs(Vector3D::DotProduct(a, b)), 1);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
391 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
392 else
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
393 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
394 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
395 "Only applicable to normalized vectors");
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
396 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
397 }
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
398 };
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
401
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
402 static bool MyParseDouble(double& value,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
403 const std::string& s)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
404 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
405 #if 1
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
406 // 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
407 // "boost::lexical_cast<double>()"
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
408 char* end = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
409 value = strtod(s.c_str(), &end);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
410 return (end == s.c_str() + s.size());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
411 #else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
412 return Orthanc::SerializationToolbox::ParseDouble(value, s);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
413 #endif
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
416
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
417 class StructurePolygon : public boost::noncopyable
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
418 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
419 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
420 std::string roiName_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
421 std::string referencedSopInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
422 uint8_t red_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
423 uint8_t green_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
424 uint8_t blue_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
425 std::vector<Vector3D> points_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
426
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
427 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
428 StructurePolygon(Orthanc::ParsedDicomFile& dicom,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
429 unsigned long roiIndex,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
430 unsigned long contourIndex)
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 DcmDataset& dataset = *dicom.GetDcmtkObject().getDataset();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
433
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
434 DcmItem* structure = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
435 DcmItem* roi = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
436 DcmItem* contour = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
437 DcmSequenceOfItems* referenced = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
438
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
439 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
440 structure == NULL ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
441 !dataset.findAndGetSequenceItem(DCM_ROIContourSequence, roi, roiIndex).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
442 roi == NULL ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
443 !roi->findAndGetSequenceItem(DCM_ContourSequence, contour, contourIndex).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
444 contour == NULL ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
445 !contour->findAndGetSequence(DCM_ContourImageSequence, referenced).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
446 referenced == NULL ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
447 referenced->card() != 1)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
448 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
449 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
450 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
451
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
452 roiName_ = GetStringValue(*structure, DCM_ROIName);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
453 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
454
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
455 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
456 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
457 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
458 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
459
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
460 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
461 std::vector<std::string> tokens;
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
462 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
463
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
464 uint32_t r, g, b;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
465 if (tokens.size() != 3 ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
466 !Orthanc::SerializationToolbox::ParseFirstUnsignedInteger32(r, tokens[0]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
467 !Orthanc::SerializationToolbox::ParseFirstUnsignedInteger32(g, tokens[1]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
468 !Orthanc::SerializationToolbox::ParseFirstUnsignedInteger32(b, tokens[2]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
469 r > 255 ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
470 g > 255 ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
471 b > 255)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
472 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
473 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
476 red_ = r;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
477 green_ = g;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
478 blue_ = b;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
479 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
480
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
481 {
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
482 std::vector<std::string> tokens;
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
483 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
484
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
485 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
486
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
487 uint32_t countPoints;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
488 if (!Orthanc::SerializationToolbox::ParseUnsignedInteger32(countPoints, s) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
489 tokens.size() != 3 * countPoints)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
490 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
491 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
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 points_.reserve(countPoints);
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 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
497 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
498 double x, y, z;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
499 if (!MyParseDouble(x, tokens[i]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
500 !MyParseDouble(y, tokens[i + 1]) ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
501 !MyParseDouble(z, tokens[i + 2]))
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
504 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
505
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
506 points_.push_back(Vector3D(x, y, z));
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 assert(points_.size() == countPoints);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
510 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
511 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
512
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
513 const std::string& GetRoiName() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
514 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
515 return roiName_;
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
518 const std::string& GetReferencedSopInstanceUid() const
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 return referencedSopInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
521 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
522
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
523 size_t GetPointsCount() const
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 points_.size();
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 const Vector3D& GetPoint(size_t i) const
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 if (i >= points_.size())
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
533 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
534 else
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 return points_[i];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
537 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
538 }
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 bool IsCoplanar(Vector3D& normal) const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
541 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
542 if (points_.size() < 3)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
543 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
544 return false;
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
547 bool hasNormal = false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
548
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
549 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
550 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
551 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
552 Vector3D(points_[2], points_[0]));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
553 if (!IsNear(normal.ComputeNorm(), 0))
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 normal.Normalize();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
556 hasNormal = true;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
557 }
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 if (!hasNormal)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
561 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
562 return false;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
563 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
564
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
565 double a = Vector3D::DotProduct(points_[0], normal);
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 = 1; 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 double b = Vector3D::DotProduct(points_[i], normal);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
570 if (!IsNear(a, b))
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 return false;
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 return true;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
577 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
578
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
579 void Add(Extent2D& extent,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
580 const Vector3D& axisX,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
581 const Vector3D& axisY) const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
582 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
583 assert(IsNear(1, axisX.ComputeNorm()));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
584 assert(IsNear(1, axisY.ComputeNorm()));
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 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
587 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
588 extent.Add(Vector3D::DotProduct(axisX, points_[i]),
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
589 Vector3D::DotProduct(axisY, points_[i]));
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
590 }
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
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 struct IsNearPredicate
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
597 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
598 bool operator() (const double& a,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
599 const double& b)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
600 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
601 return IsNear(a, b);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
602 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
603 };
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 static void RemoveDuplicateValues(std::vector<double>& v)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
606 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
607 IsNearPredicate predicate;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
608 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
609 v.erase(last, v.end());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
610 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
611
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
612
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
613 class StructureSet : public boost::noncopyable
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
614 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
615 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
616 std::vector<StructurePolygon*> polygons_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
617 std::string patientId_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
618 std::string studyInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
619 std::string seriesInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
620 std::string sopInstanceUid_;
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
621 bool hasFrameOfReferenceUid_;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
622 std::string frameOfReferenceUid_;
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
623
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
624 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
625 explicit StructureSet(Orthanc::ParsedDicomFile& dicom) :
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
626 hasFrameOfReferenceUid_(false)
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
627 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
628 DcmDataset& dataset = *dicom.GetDcmtkObject().getDataset();
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
629 patientId_ = GetStringValue(dataset, DCM_PatientID);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
630 studyInstanceUid_ = GetStringValue(dataset, DCM_StudyInstanceUID);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
631 seriesInstanceUid_ = GetStringValue(dataset, DCM_SeriesInstanceUID);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
632 sopInstanceUid_ = GetStringValue(dataset, DCM_SOPInstanceUID);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
633
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
634 DcmSequenceOfItems* frame = NULL;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
635 if (!dataset.findAndGetSequence(DCM_ReferencedFrameOfReferenceSequence, frame).good() ||
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
636 frame == NULL)
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
637 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
638 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
639 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
640
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
641 if (frame->card() == 1)
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
642 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
643 const char* v = NULL;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
644 if (frame->getItem(0)->findAndGetString(DCM_FrameOfReferenceUID, v).good() &&
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
645 v != NULL)
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
646 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
647 hasFrameOfReferenceUid_ = true;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
648 frameOfReferenceUid_.assign(v);
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
649 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
650 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
651
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
652 DcmSequenceOfItems* rois = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
653 if (!dataset.findAndGetSequence(DCM_ROIContourSequence, rois).good() ||
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
654 rois == NULL)
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
659 std::vector<DcmSequenceOfItems*> contours(rois->card());
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
660 size_t countPolygons = 0;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
661
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
662 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
663 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
664 DcmSequenceOfItems* contour = NULL;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
665 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
666 contour == NULL)
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
669 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
670 else
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 contours[i] = contour;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
673 countPolygons += contour->card();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
674 }
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
677 polygons_.resize(countPolygons);
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 size_t pos = 0;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
680 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
681 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
682 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
683 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
684 polygons_[pos] = new StructurePolygon(dicom, i, j);
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 }
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 assert(pos == countPolygons);
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 ~StructureSet()
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 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
694 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
695 assert(polygons_[i] != NULL);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
696 delete polygons_[i];
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 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
699
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
700 const std::string& GetPatientId() const
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
701 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
702 return patientId_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
703 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
704
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
705 const std::string& GetStudyInstanceUid() const
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 return studyInstanceUid_;
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
710 const std::string& GetSeriesInstanceUid() const
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 return seriesInstanceUid_;
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
715 const std::string& GetSopInstanceUid() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
716 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
717 return sopInstanceUid_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
718 }
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 std::string HashStudy() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
721 {
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
722 Orthanc::DicomInstanceHasher hasher(patientId_, studyInstanceUid_, seriesInstanceUid_, sopInstanceUid_);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
723 return hasher.HashStudy();
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
724 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
725
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
726 size_t GetPolygonsCount() const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
727 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
728 return polygons_.size();
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
729 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
730
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
731 const StructurePolygon& GetPolygon(size_t i) const
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
732 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
733 if (i >= polygons_.size())
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
734 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
735 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
736 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
737 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
738 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
739 assert(polygons_[i] != NULL);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
740 return *polygons_[i];
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
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
744 bool HasFrameOfReferenceUid() const
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
745 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
746 return hasFrameOfReferenceUid_;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
747 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
748
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
749 const std::string& GetFrameOfReferenceUid() const
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
750 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
751 if (hasFrameOfReferenceUid_)
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
752 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
753 return frameOfReferenceUid_;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
754 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
755 else
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
756 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
757 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
758 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
759 }
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
760 };
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
761
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
762
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
763 class StructureSetGeometry : public boost::noncopyable
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 private:
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
766 bool strict_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
767 Vector3D slicesNormal_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
768 double slicesSpacing_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
769 double minProjectionAlongNormal_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
770 double maxProjectionAlongNormal_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
771 size_t slicesCount_;
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 bool LookupProjectionIndex(size_t& index,
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
774 double z) const
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
775 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
776 if (slicesCount_ == 0)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
777 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
778 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
779 }
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 (z < minProjectionAlongNormal_ ||
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
782 z > maxProjectionAlongNormal_)
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_ParameterOutOfRange);
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
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
787 assert(slicesSpacing_ > 0 &&
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
788 minProjectionAlongNormal_ < maxProjectionAlongNormal_);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
789
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
790 double d = (z - minProjectionAlongNormal_) / slicesSpacing_;
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 if (IsNear(d, round(d)))
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 if (d < 0.0 ||
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
795 d > static_cast<double>(slicesCount_) - 1.0)
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
798 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
799 else
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
800 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
801 index = static_cast<size_t>(round(d));
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
802 return true;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
803 }
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 else
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
806 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
807 return false;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
808 }
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
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
811 public:
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
812 StructureSetGeometry(const StructureSet& structures,
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
813 bool strict) :
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
814 strict_(strict)
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 bool isValid = false;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
817
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
818 std::vector<double> projections;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
819 projections.reserve(structures.GetPolygonsCount());
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
820
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
821 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
822 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
823 Vector3D normal;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
824 if (structures.GetPolygon(i).IsCoplanar(normal))
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 // 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
827 if (!isValid)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
828 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
829 isValid = true;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
830 slicesNormal_ = normal;
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
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
833 if (Vector3D::AreParallel(normal, slicesNormal_))
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
834 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
835 // 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
836 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
837 projections.push_back(Vector3D::DotProduct(point, slicesNormal_));
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
838 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
839 else
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
840 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
841 // RT-STRUCT with non-parallel slices
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
842 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
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 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
845 else
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
846 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
847 // Ignore slices that are not coplanar
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
848 }
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
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
851 if (projections.empty())
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
852 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
853 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented,
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
854 "Structure set without a valid geometry");
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
855 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
856
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
857 // Only keep unique projections
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 std::sort(projections.begin(), projections.end());
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
860 RemoveDuplicateValues(projections);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
861 assert(!projections.empty());
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 if (projections.size() == 1)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
864 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
865 // Volume with one single slice
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
866 minProjectionAlongNormal_ = projections[0];
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
867 maxProjectionAlongNormal_ = projections[0];
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
868 slicesSpacing_ = 1; // Arbitrary value
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
869 slicesCount_ = 1;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
870 return;
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
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
874 // 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
875
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
876 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
877 std::vector<double> spacings;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
878 spacings.resize(projections.size() - 1);
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 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
881 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
882 spacings[i] = projections[i + 1] - projections[i];
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
883 assert(spacings[i] > 0);
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 std::sort(spacings.begin(), spacings.end());
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
887 RemoveDuplicateValues(spacings);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
888
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
889 if (spacings.empty())
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
890 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
891 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
892 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
893
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
894 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
895 assert(slicesSpacing_ > 0);
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
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
899 // 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
900
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
901 bool first = true;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
902 size_t bestSupport;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
903 double bestProjection;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
904
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
905 std::list<size_t> candidates;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
906 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
907 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
908 candidates.push_back(i);
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
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
911 while (!candidates.empty())
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 std::list<size_t> next;
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 size_t countSupport = 0;
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 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
918 size_t reference = *it;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
919 it++;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
920
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
921 while (it != candidates.end())
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 double d = (projections[*it] - projections[reference]) / slicesSpacing_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
924 if (IsNear(d, round(d)))
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 countSupport ++;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
927 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
928 else
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 next.push_back(*it);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
931 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
932
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
933 it++;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
934 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
935
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
936 if (first ||
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
937 countSupport > bestSupport)
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
938 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
939 first = false;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
940 bestSupport = countSupport;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
941 bestProjection = projections[reference];
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
942 }
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 if (strict &&
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
945 !next.empty())
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat,
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
948 "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
949 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
950
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
951 candidates.swap(next);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
952 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
953
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 // Compute the range of the projections
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 minProjectionAlongNormal_ = bestProjection;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
958 maxProjectionAlongNormal_ = bestProjection;
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 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
961 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
962 double d = (projections[i] - bestProjection) / slicesSpacing_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
963 if (IsNear(d, round(d)))
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
964 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
965 minProjectionAlongNormal_ = std::min(minProjectionAlongNormal_, projections[i]);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
966 maxProjectionAlongNormal_ = std::max(maxProjectionAlongNormal_, projections[i]);
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 }
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 double d = (maxProjectionAlongNormal_ - minProjectionAlongNormal_) / slicesSpacing_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
971 if (IsNear(d, round(d)))
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
972 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
973 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
974 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
975 else
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
976 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
977 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
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
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
981 // Sanity check
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
982
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
983 size_t a, b;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
984 if (!LookupProjectionIndex(a, minProjectionAlongNormal_) ||
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
985 !LookupProjectionIndex(b, maxProjectionAlongNormal_) ||
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
986 a != 0 ||
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
987 b + 1 != slicesCount_)
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
990 }
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
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
993 const Vector3D& GetSlicesNormal() const
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 return slicesNormal_;
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
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
998 double GetSlicesSpacing() const
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 return slicesSpacing_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1001 }
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 double GetMinProjectionAlongNormal() const
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1004 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1005 return minProjectionAlongNormal_;
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
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1008 double GetMaxProjectionAlongNormal() const
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 return maxProjectionAlongNormal_;
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
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1013 bool ProjectAlongNormal(double& z,
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1014 const StructurePolygon& polygon) const
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 Vector3D normal;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1017 if (polygon.IsCoplanar(normal) &&
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1018 Vector3D::AreParallel(normal, slicesNormal_))
28
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 z = Vector3D::DotProduct(polygon.GetPoint(0), slicesNormal_);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1021 return true;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1022 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1023 else
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1024 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1025 return false;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1026 }
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 size_t GetSlicesCount() const
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1030 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1031 return slicesCount_;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1032 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1033
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1034 bool LookupSliceIndex(size_t& slice,
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1035 const StructurePolygon& polygon) const
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1036 {
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1037 double z;
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1038 return (ProjectAlongNormal(z, polygon) &&
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1039 LookupProjectionIndex(slice, z));
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1040 }
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1041 };
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1042
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1043
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1044
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1045
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1046 class XorFiller : public Orthanc::ImageProcessing::IPolygonFiller
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 private:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1049 Orthanc::ImageAccessor& target_;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1050
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1051 public:
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1052 XorFiller(Orthanc::ImageAccessor& target) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1053 target_(target)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1054 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1055 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1056
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1057 virtual void Fill(int y,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1058 int x1,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1059 int x2) ORTHANC_OVERRIDE
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1060 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1061 assert(x1 <= x2);
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 if (y >= 0 &&
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1064 y < static_cast<int>(target_.GetHeight()))
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 x1 = std::max(x1, 0);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1067 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
1068
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1069 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
1070
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1071 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
1072 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1073 *p = (*p ^ 0xff);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1074 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1075 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1076 }
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
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1079
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1080 static void WriteFloat(Orthanc::ChunkedBuffer& buffer,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1081 float value,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1082 Orthanc::Endianness endianness)
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1083 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1084 switch (endianness)
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1085 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1086 case Orthanc::Endianness_Little:
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1087 buffer.AddChunk(&value, sizeof(float));
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1088 break;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1089
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1090 case Orthanc::Endianness_Big:
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1091 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1092 uint8_t tmp[4];
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1093 tmp[0] = reinterpret_cast<uint8_t*>(&value) [3];
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1094 tmp[1] = reinterpret_cast<uint8_t*>(&value) [2];
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1095 tmp[2] = reinterpret_cast<uint8_t*>(&value) [1];
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1096 tmp[3] = reinterpret_cast<uint8_t*>(&value) [0];
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1097 buffer.AddChunk(&tmp, sizeof(float));
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1098 break;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1099 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1100
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1101 default:
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1102 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1103 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1104 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1105
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1106
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1107 static void WriteInteger(Orthanc::ChunkedBuffer& buffer,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1108 uint32_t value,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1109 Orthanc::Endianness endianness)
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1110 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1111 switch (endianness)
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1112 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1113 case Orthanc::Endianness_Little:
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1114 buffer.AddChunk(&value, sizeof(uint32_t));
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1115 break;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1116
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1117 case Orthanc::Endianness_Big:
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1118 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1119 uint8_t tmp[4];
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1120 tmp[0] = reinterpret_cast<uint8_t*>(&value) [3];
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1121 tmp[1] = reinterpret_cast<uint8_t*>(&value) [2];
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1122 tmp[2] = reinterpret_cast<uint8_t*>(&value) [1];
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1123 tmp[3] = reinterpret_cast<uint8_t*>(&value) [0];
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1124 buffer.AddChunk(&tmp, sizeof(uint32_t));
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1125 break;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1126 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1127
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1128 default:
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1129 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1130 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1131 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1132
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1133
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1134 static void EncodeSTL(std::string& target /* out */,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1135 vtkPolyData& mesh /* in */)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1136 {
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1137 const Orthanc::Endianness endianness = Orthanc::Toolbox::DetectEndianness();
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1138
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1139 Orthanc::ChunkedBuffer buffer;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1140
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1141 uint8_t header[80];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1142 memset(header, 0, sizeof(header));
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1143 buffer.AddChunk(header, sizeof(header)); // This doesn't depend on endianness
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1144
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1145 WriteInteger(buffer, mesh.GetNumberOfCells(), endianness);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1146
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1147 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
1148 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1149 vtkCell* cell = mesh.GetCell(i);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1150 vtkTriangle* triangle = dynamic_cast<vtkTriangle*>(cell);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1151
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1152 double p0[3];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1153 double p1[3];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1154 double p2[3];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1155 triangle->GetPoints()->GetPoint(0, p0);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1156 triangle->GetPoints()->GetPoint(1, p1);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1157 triangle->GetPoints()->GetPoint(2, p2);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1158
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1159 double normal[3];
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1160 vtkTriangle::ComputeNormal(p0, p1, p2, normal);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1161
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1162 WriteFloat(buffer, normal[0], endianness);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1163 WriteFloat(buffer, normal[1], endianness);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1164 WriteFloat(buffer, normal[2], endianness);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1165 WriteFloat(buffer, p0[0], endianness);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1166 WriteFloat(buffer, p0[1], endianness);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1167 WriteFloat(buffer, p0[2], endianness);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1168 WriteFloat(buffer, p1[0], endianness);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1169 WriteFloat(buffer, p1[1], endianness);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1170 WriteFloat(buffer, p1[2], endianness);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1171 WriteFloat(buffer, p2[0], endianness);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1172 WriteFloat(buffer, p2[1], endianness);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1173 WriteFloat(buffer, p2[2], endianness);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1174
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1175 uint16_t a = 0;
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1176 buffer.AddChunk(&a, sizeof(a)); // This doesn't depend on endianness
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1177 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1178
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1179 buffer.Flatten(target);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1180 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1181
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1182
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1183 bool EncodeVolume(std::string& stl,
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1184 vtkImageData* volume,
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1185 unsigned int resolution,
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1186 bool smooth)
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1187 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1188 if (volume == NULL)
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1189 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1190 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1191 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1192
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1193 vtkNew<vtkImageResize> resize;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1194 resize->SetOutputDimensions(resolution, resolution, resolution);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1195 resize->SetInputData(volume);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1196 resize->Update();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1197
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1198 vtkNew<vtkImageConstantPad> padding;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1199 padding->SetConstant(0);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1200 padding->SetOutputNumberOfScalarComponents(1);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1201 padding->SetOutputWholeExtent(-1, resolution, -1, resolution, -1, resolution);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1202 padding->SetInputData(resize->GetOutput());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1203 padding->Update();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1204
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1205 double range[2];
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1206 padding->GetOutput()->GetScalarRange(range);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1207
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1208 const double isoValue = (range[0] + range[1]) / 2.0;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1209
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1210 vtkNew<vtkMarchingCubes> surface;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1211 surface->SetInputData(padding->GetOutput());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1212 surface->ComputeNormalsOn();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1213 surface->SetValue(0, isoValue);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1214 surface->Update();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1215
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1216 if (smooth)
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1217 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1218 vtkNew<vtkSmoothPolyDataFilter> smoothFilter;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1219 // Apply volume smoothing
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1220 // https://examples.vtk.org/site/Cxx/PolyData/SmoothPolyDataFilter/
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1221 smoothFilter->SetInputConnection(surface->GetOutputPort());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1222 smoothFilter->SetNumberOfIterations(15);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1223 smoothFilter->SetRelaxationFactor(0.1);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1224 smoothFilter->FeatureEdgeSmoothingOff();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1225 smoothFilter->BoundarySmoothingOn();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1226 smoothFilter->Update();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1227
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1228 vtkNew<vtkPolyDataNormals> normalGenerator;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1229 normalGenerator->SetInputConnection(smoothFilter->GetOutputPort());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1230 normalGenerator->ComputePointNormalsOn();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1231 normalGenerator->ComputeCellNormalsOn();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1232 normalGenerator->Update();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1233
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1234 EncodeSTL(stl, *normalGenerator->GetOutput());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1235 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1236 else
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1237 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1238 EncodeSTL(stl, *surface->GetOutput());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1239 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1240
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1241 return true;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1242 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1243
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1244
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1245 static Orthanc::ParsedDicomFile* LoadInstance(const std::string& instanceId)
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1246 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1247 std::string dicom;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1248
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1249 if (!OrthancPlugins::RestApiGetString(dicom, "/instances/" + instanceId + "/file", false))
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1250 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1251 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1252 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1253 else
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1254 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1255 return new Orthanc::ParsedDicomFile(dicom);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1256 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1257 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1258
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1259
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1260 static void GetReferencedVolumeAxes(Vector3D& axisX,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1261 Vector3D& axisY,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1262 const StructureSet& structureSet)
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1263 {
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1264 // This is a rough guess for the X/Y axes
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1265 axisX = Vector3D(1, 0, 0);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1266 axisY = Vector3D(0, 1, 0);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1267
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1268 // Look for one instance from the referenced volume
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1269 const std::string& sopInstanceUid = structureSet.GetPolygon(0).GetReferencedSopInstanceUid();
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1270
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1271 Json::Value response;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1272 if (OrthancPlugins::RestApiPost(response, "/tools/lookup", sopInstanceUid, false))
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1273 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1274 if (response.type() != Json::arrayValue)
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1275 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1276 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1277 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1278
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1279 bool first = true;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1280
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1281 for (Json::Value::ArrayIndex i = 0; i < response.size(); i++)
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1282 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1283 if (response[i].type() != Json::objectValue)
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1284 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1285 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1286 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1287
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1288 if (Orthanc::SerializationToolbox::ReadString(response[i], "Type") == "Instance")
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1289 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1290 if (first)
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1291 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1292 const std::string& instanceId = Orthanc::SerializationToolbox::ReadString(response[i], "ID");
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1293 std::unique_ptr<Orthanc::ParsedDicomFile> reference(LoadInstance(instanceId));
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1294
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1295 std::string imageOrientation;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1296 if (reference->GetTagValue(imageOrientation, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT))
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1297 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1298 std::vector<std::string> items;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1299 Orthanc::Toolbox::TokenizeString(items, imageOrientation, '\\');
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1300
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1301 double x1, x2, x3, y1, y2, y3;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1302
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1303 if (items.size() == 6 &&
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1304 MyParseDouble(y1, items[0]) &&
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1305 MyParseDouble(y2, items[1]) &&
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1306 MyParseDouble(y3, items[2]) &&
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1307 MyParseDouble(x1, items[3]) &&
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1308 MyParseDouble(x2, items[4]) &&
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1309 MyParseDouble(x3, items[5]))
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1310 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1311 axisX = Vector3D(x1, x2, x3);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1312 axisY = Vector3D(y1, y2, y3);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1313 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1314 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1315 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1316 else
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1317 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1318 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1319 "Multiple instances with the same SOP Instance UID");
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1320 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1321 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1322 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1323 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1324 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1325
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1326
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1327 static bool EncodeStructureSetMesh(std::string& stl,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1328 const StructureSet& structureSet,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1329 const StructureSetGeometry& geometry,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1330 const std::set<std::string>& roiNames,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1331 unsigned int resolution,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1332 bool smooth)
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1333 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1334 if (resolution < 1 ||
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1335 structureSet.GetPolygonsCount() < 1)
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1336 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1337 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1338 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1339
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1340 if (!IsNear(1, geometry.GetSlicesNormal().ComputeNorm()))
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1341 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1342 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1343 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1344
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1345 Vector3D axisX, axisY;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1346 GetReferencedVolumeAxes(axisX, axisY, structureSet);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1347
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1348 Vector3D axisZ = Vector3D::CrossProduct(axisX, axisY);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1349
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1350 if (!IsNear(1, axisX.ComputeNorm()) ||
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1351 !IsNear(1, axisY.ComputeNorm()) ||
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1352 !Vector3D::AreParallel(axisZ, geometry.GetSlicesNormal()))
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1353 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1354 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1355 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1356
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1357 Extent2D extent;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1358 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
1359 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1360 structureSet.GetPolygon(i).Add(extent, axisX, axisY);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1361 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1362
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1363 const int depth = geometry.GetSlicesCount();
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1364
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1365 vtkNew<vtkImageData> volume;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1366 volume->SetDimensions(resolution, resolution, depth);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1367 volume->AllocateScalars(VTK_UNSIGNED_CHAR, 1);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1368
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1369 assert(sizeof(unsigned char) == 1);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1370 memset(volume->GetScalarPointer(), 0, resolution * resolution * depth);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1371
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1372 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
1373 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1374 const StructurePolygon& polygon = structureSet.GetPolygon(i);
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1375 if (roiNames.find(polygon.GetRoiName()) != roiNames.end())
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1376 {
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1377 // This polygon corresponds to a ROI of interest
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1378
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1379 size_t z;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1380 if (geometry.LookupSliceIndex(z, polygon))
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1381 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1382 std::vector<Orthanc::ImageProcessing::ImagePoint> points;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1383 points.reserve(polygon.GetPointsCount());
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1384
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1385 for (size_t j = 0; j < polygon.GetPointsCount(); j++)
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1386 {
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1387 const Vector3D& point = polygon.GetPoint(j);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1388 double x = (Vector3D::DotProduct(point, axisX) - extent.GetMinX()) / extent.GetWidth() * static_cast<double>(resolution);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1389 double y = (Vector3D::DotProduct(point, axisY) - extent.GetMinY()) / extent.GetHeight() * static_cast<double>(resolution);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1390 points.push_back(Orthanc::ImageProcessing::ImagePoint(static_cast<int32_t>(std::floor(x)),
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1391 static_cast<int32_t>(std::floor(y))));
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1392 }
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1393
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1394 Orthanc::ImageAccessor slice;
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1395 slice.AssignWritable(Orthanc::PixelFormat_Grayscale8, resolution, resolution, resolution /* pitch */,
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1396 reinterpret_cast<uint8_t*>(volume->GetScalarPointer()) + z * resolution * resolution);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1397
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1398 XorFiller filler(slice);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1399 Orthanc::ImageProcessing::FillPolygon(filler, points);
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1400 }
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1401 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1402 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1403
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1404 volume->SetSpacing(extent.GetWidth() / static_cast<double>(resolution),
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1405 extent.GetHeight() / static_cast<double>(resolution),
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1406 geometry.GetSlicesSpacing());
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1407
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1408 // TODO
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1409 // volume->SetOrigin()
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1410
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1411 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
1412 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1413
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 void ListStructures(OrthancPluginRestOutput* output,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1416 const char* url,
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1417 const OrthancPluginHttpRequest* request)
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 if (request->method != OrthancPluginHttpMethod_Get)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1420 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1421 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "GET");
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1422 return;
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
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1425 const std::string instanceId(request->groups[0]);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1426
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1427 std::unique_ptr<Orthanc::ParsedDicomFile> dicom(LoadInstance(instanceId));
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1428
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1429 std::set<std::string> names;
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1430 ListStructuresNames(names, *dicom);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1431
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1432 Json::Value answer = Json::arrayValue;
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1433
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1434 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
1435 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1436 answer.append(*it);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1437 }
1
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::string s = answer.toStyledString();
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1440 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
1441 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1442
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1443
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1444 static void AddDefaultTagValue(Json::Value& target,
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1445 const Orthanc::DicomTag& tag,
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1446 const std::string& value)
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1447 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1448 if (!target.isMember(tag.Format()))
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1449 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1450 target[tag.Format()] = value;
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1451 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1452 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1453
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1454
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1455 static void AddDefaultTagValue(Json::Value& target,
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1456 const DcmTagKey& tag,
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1457 const std::string& value)
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1458 {
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1459 AddDefaultTagValue(target, Orthanc::DicomTag(tag.getGroup(), tag.getElement()), value);
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1460 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1461
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 static void CallCreateDicom(Json::Value& answer,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1464 const std::string& stl,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1465 const Json::Value& body,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1466 const std::string& parentStudy,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1467 const std::string& defaultSeriesDescription,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1468 const std::string& defaultFrameOfReferenceUid,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1469 const std::string& defaultTitle)
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1470 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1471 static const char* const KEY_TAGS = "Tags";
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1472
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1473 Json::Value normalized = Json::objectValue;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1474
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1475 if (body.isMember(KEY_TAGS))
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1476 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1477 const Json::Value& tags = body[KEY_TAGS];
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1478
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1479 if (tags.type() != Json::objectValue)
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1480 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1481 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
1482 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1483
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1484 std::vector<std::string> keys = tags.getMemberNames();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1485 for (size_t i = 0; i < keys.size(); i++)
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1486 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1487 const Orthanc::DicomTag tag = Orthanc::FromDcmtkBridge::ParseTag(keys[i]);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1488 normalized[tag.Format()] = tags[keys[i]];
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1489 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1490 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1491
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1492 if (!normalized.isMember(Orthanc::DICOM_TAG_SERIES_DESCRIPTION.Format()))
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1493 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1494 normalized[Orthanc::DICOM_TAG_SERIES_DESCRIPTION.Format()] = defaultSeriesDescription;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1495 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1496
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1497 AddDefaultTagValue(normalized, Orthanc::DICOM_TAG_SERIES_NUMBER, "1");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1498 AddDefaultTagValue(normalized, Orthanc::DICOM_TAG_FRAME_OF_REFERENCE_UID, defaultFrameOfReferenceUid);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1499 AddDefaultTagValue(normalized, Orthanc::DICOM_TAG_INSTANCE_NUMBER, "1");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1500
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1501 AddDefaultTagValue(normalized, DCM_BurnedInAnnotation, "NO");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1502 AddDefaultTagValue(normalized, DCM_DeviceSerialNumber, ORTHANC_STL_VERSION);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1503 AddDefaultTagValue(normalized, DCM_DocumentTitle, defaultTitle);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1504 AddDefaultTagValue(normalized, DCM_Manufacturer, "Orthanc STL plugin");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1505 AddDefaultTagValue(normalized, DCM_ManufacturerModelName, "Orthanc STL plugin");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1506 AddDefaultTagValue(normalized, DCM_PositionReferenceIndicator, "");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1507 AddDefaultTagValue(normalized, DCM_SoftwareVersions, ORTHANC_STL_VERSION);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1508 AddDefaultTagValue(normalized, DCM_ConceptNameCodeSequence, "");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1509
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1510 std::string date, time;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1511 Orthanc::SystemToolbox::GetNowDicom(date, time, true /* use UTC time (not local time) */);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1512 AddDefaultTagValue(normalized, DCM_AcquisitionDateTime, date + time);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1513
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1514 const Orthanc::DicomTag MEASUREMENT_UNITS_CODE_SEQUENCE(DCM_MeasurementUnitsCodeSequence.getGroup(),
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1515 DCM_MeasurementUnitsCodeSequence.getElement());
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1516
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1517 if (!normalized.isMember(MEASUREMENT_UNITS_CODE_SEQUENCE.Format()))
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1518 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1519 Json::Value item;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1520 item["CodeValue"] = "mm";
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1521 item["CodingSchemeDesignator"] = "UCUM";
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1522 item["CodeMeaning"] = defaultTitle;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1523
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1524 normalized[MEASUREMENT_UNITS_CODE_SEQUENCE.Format()].append(item);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1525 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1526
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1527 std::string content;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1528 Orthanc::Toolbox::EncodeDataUriScheme(content, Orthanc::MIME_STL, stl);
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1529
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1530 Json::Value create;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1531 create["Content"] = content;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1532 create["Parent"] = parentStudy;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1533 create["Tags"] = normalized;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1534
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1535 if (!OrthancPlugins::RestApiPost(answer, "/tools/create-dicom", create.toStyledString(), false))
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1536 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1537 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest, "Cannot create DICOM from STL");
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1538 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1539 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1540
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1541
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1542 void EncodeStructureSet(OrthancPluginRestOutput* output,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1543 const char* url,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1544 const OrthancPluginHttpRequest* request)
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1545 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1546 static const char* const KEY_INSTANCE = "Instance";
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1547 static const char* const KEY_RESOLUTION = "Resolution";
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1548 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
1549 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
1550 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
1551
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1552 if (request->method != OrthancPluginHttpMethod_Post)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1553 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1554 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "POST");
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1555 return;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1556 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1557
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1558 Json::Value body;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1559 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
1560 {
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1561 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1562 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1563
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1564 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
1565 const bool smooth = (body.isMember(KEY_SMOOTH) ?
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1566 Orthanc::SerializationToolbox::ReadBoolean(body, KEY_SMOOTH) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1567 true /* smooth by default */);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1568 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
1569 Orthanc::SerializationToolbox::ReadUnsignedInteger(body, KEY_RESOLUTION) :
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1570 256 /* default value */);
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1571 const bool strict = (body.isMember(KEY_STRICT) ?
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1572 Orthanc::SerializationToolbox::ReadBoolean(body, KEY_STRICT) :
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1573 true /* strict by default */);
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1574
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1575 std::set<std::string> roiNames;
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1576 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
1577
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1578 std::unique_ptr<Orthanc::ParsedDicomFile> dicom(LoadInstance(instanceId));
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1579
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1580 StructureSet structureSet(*dicom);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1581
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1582 StructureSetGeometry geometry(structureSet, strict);
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1583
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1584 std::string stl;
28
410003c50b17 improved computation of RT-STRUCT geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 25
diff changeset
1585 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
1586 {
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1587 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
1588 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1589 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1590 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1591 std::string seriesDescription;
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1592
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1593 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
1594 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1595 seriesDescription += ": ";
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1596 }
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1597 else
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1598 {
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1599 seriesDescription.clear();
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1600 }
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1601
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1602 bool first = true;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1603 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
1604 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1605 if (first)
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1606 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1607 first = false;
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1608 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1609 else
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1610 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1611 seriesDescription += ", ";
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1612 }
2
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1613
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1614 seriesDescription += *it;
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1615 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1616
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1617 std::string frameOfReferenceUid;
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1618 if (structureSet.HasFrameOfReferenceUid())
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1619 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1620 frameOfReferenceUid = structureSet.GetFrameOfReferenceUid();
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1621 }
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1622 else
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1623 {
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1624 frameOfReferenceUid = Orthanc::FromDcmtkBridge::GenerateUniqueIdentifier(Orthanc::ResourceType_Instance);
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1625 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1626
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1627 Json::Value answer;
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1628 CallCreateDicom(answer, stl, body, structureSet.HashStudy(), seriesDescription,
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1629 frameOfReferenceUid, "STL model generated from DICOM RT-STRUCT");
4
5ee4448a8ff8 generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3
diff changeset
1630
7
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1631 std::string s = answer.toStyledString();
e3e59de705f6 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 6
diff changeset
1632 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
1633 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1634 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1635
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1636
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1637 void ExtractStl(OrthancPluginRestOutput* output,
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1638 const char* url,
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1639 const OrthancPluginHttpRequest* request)
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1640 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1641 if (request->method != OrthancPluginHttpMethod_Get)
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1642 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1643 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "GET");
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1644 return;
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1645 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1646
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1647 const std::string instanceId(request->groups[0]);
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1648
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1649 std::unique_ptr<Orthanc::ParsedDicomFile> dicom(LoadInstance(instanceId));
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1650 DcmDataset& dataset = *dicom->GetDcmtkObject().getDataset();
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1651
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1652 std::string stl;
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1653 if (GetStringValue(dataset, DCM_MIMETypeOfEncapsulatedDocument) != Orthanc::MIME_STL ||
29
62abf3c523f9 big endian support, retrieve axes from referenced volume
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 28
diff changeset
1654 GetStringValue(dataset, DCM_SOPClassUID) != UID_EncapsulatedSTLStorage ||
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1655 !dicom->GetTagValue(stl, Orthanc::DICOM_TAG_ENCAPSULATED_DOCUMENT))
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1656 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1657 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
1658 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1659 else
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1660 {
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1661 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output,
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1662 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
1663 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1664 }
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1665
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1666
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1667
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1668 class NiftiHeader : public boost::noncopyable
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1669 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1670 private:
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1671 nifti_image* image_;
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1672
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1673 public:
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1674 NiftiHeader(const std::string& nifti)
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1675 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1676 nifti_1_header header;
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1677 if (nifti.size() < sizeof(header))
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1678 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1679 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1680 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1681
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1682 memcpy(&header, nifti.c_str(), sizeof(header));
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1683 if (!nifti_hdr_looks_good(&header))
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1684 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1685 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1686 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1687
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1688 image_ = nifti_convert_nhdr2nim(header, "dummy_filename");
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1689 if (image_ == NULL)
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1690 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1691 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1692 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1693 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1694
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1695 ~NiftiHeader()
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1696 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1697 nifti_image_free(image_);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1698 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1699
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1700 const nifti_image& GetInfo() const
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1701 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1702 assert(image_ != NULL);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1703 return *image_;
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1704 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1705 };
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1706
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1707
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1708 static void LoadNifti(vtkImageData* volume,
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1709 std::string& nifti)
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1710 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1711 if (volume == NULL)
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1712 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1713 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1714 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1715
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1716 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
1717
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1718 if (nifti.size() >= 2 &&
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1719 p[0] == 0x1f &&
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1720 p[1] == 0x8b)
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1721 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1722 Orthanc::GzipCompressor compressor;
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1723 std::string uncompressed;
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1724 Orthanc::IBufferCompressor::Uncompress(uncompressed, compressor, nifti);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1725 nifti.swap(uncompressed);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1726 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1727
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1728 NiftiHeader header(nifti);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1729
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1730 if (header.GetInfo().ndim != 3)
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1731 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1732 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat,
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1733 "Only 3D NIfTI volumes are allowed");
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1734 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1735
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1736 size_t itemSize;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1737 int vtkType;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1738
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1739 switch (header.GetInfo().datatype)
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1740 {
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1741 case DT_UNSIGNED_CHAR:
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1742 itemSize = 1;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1743 vtkType = VTK_UNSIGNED_CHAR;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1744 break;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1745
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1746 case DT_FLOAT:
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1747 itemSize = sizeof(float);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1748 vtkType = VTK_FLOAT;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1749 break;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1750
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1751 case DT_DOUBLE:
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1752 itemSize = sizeof(double);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1753 vtkType = VTK_DOUBLE;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1754 break;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1755
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1756 default:
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1757 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1758 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1759
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1760 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
1761
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1762 const size_t pixelDataOffset = sizeof(nifti_1_header) + 4 /* extension */;
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1763
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1764 if (nifti.size() != pixelDataOffset + header.GetInfo().nvox * itemSize)
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1765 {
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1766 throw Orthanc::OrthancException(Orthanc::ErrorCode_CorruptedFile);
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1767 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1768
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1769 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
1770 volume->AllocateScalars(vtkType, 1);
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1771 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
1772 memcpy(volume->GetScalarPointer(), &nifti[pixelDataOffset], header.GetInfo().nvox * itemSize);
6
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1773 }
c02d12eb34d4 added LoadNifti()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4
diff changeset
1774
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1775
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1776 void EncodeNifti(OrthancPluginRestOutput* output,
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1777 const char* url,
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1778 const OrthancPluginHttpRequest* request)
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1779 {
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1780 static const char* const KEY_NIFTI = "Nifti";
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1781 static const char* const KEY_RESOLUTION = "Resolution";
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1782 static const char* const KEY_PARENT_STUDY = "ParentStudy";
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1783 static const char* const KEY_SMOOTH = "Smooth";
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1784
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1785 if (request->method != OrthancPluginHttpMethod_Post)
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1786 {
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1787 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "POST");
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1788 return;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1789 }
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1790
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1791 Json::Value body;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1792 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
1793 {
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1794 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1795 }
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1796
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1797 std::string mime, nifti;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1798 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
1799 {
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1800 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
1801 }
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1802
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1803 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
1804 const bool smooth = (body.isMember(KEY_SMOOTH) ?
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1805 Orthanc::SerializationToolbox::ReadBoolean(body, KEY_SMOOTH) :
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1806 true /* smooth by default */);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1807 const unsigned int resolution = (body.isMember(KEY_RESOLUTION) ?
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1808 Orthanc::SerializationToolbox::ReadUnsignedInteger(body, KEY_RESOLUTION) :
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1809 256 /* default value */);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1810
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1811 vtkNew<vtkImageData> volume;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1812 LoadNifti(volume.Get(), nifti);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1813
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1814 std::string stl;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1815 if (!EncodeVolume(stl, volume.Get(), resolution, smooth))
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1816 {
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1817 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
1818 }
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1819 else
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1820 {
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1821 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
1822
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1823 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
1824
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1825 Json::Value answer;
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1826 CallCreateDicom(answer, stl, body, parentStudy, title, frameOfReferenceUid, title);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1827
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1828 std::string s = answer.toStyledString();
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1829 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
1830 }
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1831 }
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1832
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1833
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1834 extern "C"
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1835 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1836 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1837 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1838 OrthancPlugins::SetGlobalContext(context);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1839
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1840 /* Check the version of the Orthanc core */
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1841 if (OrthancPluginCheckVersion(OrthancPlugins::GetGlobalContext()) == 0)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1842 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1843 char info[1024];
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1844 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
1845 OrthancPlugins::GetGlobalContext()->orthancVersion,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1846 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1847 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER,
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1848 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1849 OrthancPluginLogError(OrthancPlugins::GetGlobalContext(), info);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1850 return -1;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1851 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1852
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1853 #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
1854 Orthanc::Logging::InitializePluginContext(context);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1855 #else
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1856 Orthanc::Logging::Initialize(context);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1857 #endif
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1858
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1859 Orthanc::InitializeFramework("", false);
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1860
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1861 hasCreateDicomStl_ = OrthancPlugins::CheckMinimalOrthancVersion(1, 12, 1);
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1862
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1863 if (!hasCreateDicomStl_)
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1864 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1865 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
1866 << ") 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
1867 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1868
25
5fc3ea6acbd5 fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 24
diff changeset
1869 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
1870
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1871 OrthancPlugins::RegisterRestCallback<ServeFile>("/stl/app/(.*)", true);
3
0fb06c6a6c87 added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2
diff changeset
1872 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
1873 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
1874
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1875 if (hasCreateDicomStl_)
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1876 {
8
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1877 OrthancPlugins::RegisterRestCallback<EncodeStructureSet>("/stl/encode-rtstruct", true);
d1267c6c33e1 added route /stl/encode-nifti
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 7
diff changeset
1878 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
1879 }
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1880
2
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1881 // 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
1882 std::string explorer;
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1883
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1884 {
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1885 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
1886
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1887 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
1888 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
1889 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
1890
25
5fc3ea6acbd5 fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 24
diff changeset
1891 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
1892 }
2bdb9acb7dcf added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1
diff changeset
1893
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1894 return 0;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1895 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1896
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1897
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1898 ORTHANC_PLUGINS_API void OrthancPluginFinalize()
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1899 {
1
0f03a8a0bd6f encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
1900 Orthanc::FinalizeFramework();
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1901 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1902
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1903
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1904 ORTHANC_PLUGINS_API const char* OrthancPluginGetName()
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1905 {
25
5fc3ea6acbd5 fix deprecated calls
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 24
diff changeset
1906 return ORTHANC_PLUGIN_NAME;
0
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1907 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1908
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1909
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1910 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion()
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1911 {
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1912 return ORTHANC_STL_VERSION;
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1913 }
4e889a8e8be2 initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1914 }