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