Mercurial > hg > orthanc-stl
annotate Sources/Plugin.cpp @ 4:5ee4448a8ff8
generated STL pass dciodvfy
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 18 Jul 2023 11:30:06 +0200 |
parents | 0fb06c6a6c87 |
children | c02d12eb34d4 |
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 |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
27 #include <EmbeddedResources.h> |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
28 |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
29 #include <ChunkedBuffer.h> |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
30 #include <DicomParsing/FromDcmtkBridge.h> |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
31 #include <DicomParsing/ParsedDicomFile.h> |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
32 #include <Images/ImageProcessing.h> |
0
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 #include <Logging.h> |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
34 #include <OrthancFramework.h> |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
35 #include <SerializationToolbox.h> |
0
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 #include <SystemToolbox.h> |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
38 #include <vtkImageConstantPad.h> |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
39 #include <vtkImageData.h> |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
40 #include <vtkImageResize.h> |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
41 #include <vtkMarchingCubes.h> |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
42 #include <vtkNew.h> |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
43 #include <vtkPolyData.h> |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
44 #include <vtkPolyDataNormals.h> |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
45 #include <vtkSmoothPolyDataFilter.h> |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
46 #include <vtkTriangle.h> |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
47 |
0
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 #include <boost/thread/shared_mutex.hpp> |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 // Forward declaration |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 void ReadStaticAsset(std::string& target, |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 const std::string& path); |
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 /** |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
56 * 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
|
57 * "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
|
58 * 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
|
59 **/ |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
60 class ResourcesCache : public boost::noncopyable |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
61 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
62 private: |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
63 typedef std::map<std::string, std::string*> Content; |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
64 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
65 boost::shared_mutex mutex_; |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
66 Content content_; |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
67 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
68 public: |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
69 ~ResourcesCache() |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
70 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
71 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
|
72 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
73 assert(it->second != NULL); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
74 delete it->second; |
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 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
78 void Answer(OrthancPluginRestOutput* output, |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 const std::string& path) |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
80 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
81 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
|
82 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
83 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
84 // Check whether the cache already contains the resource |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 boost::shared_lock<boost::shared_mutex> lock(mutex_); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
86 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 Content::const_iterator found = content_.find(path); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 if (found != content_.end()) |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 assert(found->second != NULL); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
92 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
|
93 return; |
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 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 // This resource has not been cached yet |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
99 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
|
100 ReadStaticAsset(*item, path); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 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
|
102 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 // Store the resource into the cache |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
105 boost::unique_lock<boost::shared_mutex> lock(mutex_); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
106 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 if (content_.find(path) == content_.end()) |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
109 content_[path] = item.release(); |
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 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
116 static ResourcesCache cache_; |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
117 static bool hasCreateDicomStl_; |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
118 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
119 void ServeFile(OrthancPluginRestOutput* output, |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
120 const char* url, |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
121 const OrthancPluginHttpRequest* request) |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
122 { |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
123 if (request->method != OrthancPluginHttpMethod_Get) |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
124 { |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
125 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "GET"); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
126 return; |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
127 } |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
128 |
0
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
129 std::string file = request->groups[0]; |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
130 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
131 if (file == "viewer.html") |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
132 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
133 std::string s; |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
134 Orthanc::EmbeddedResources::GetFileResource(s, Orthanc::EmbeddedResources::VIEWER_HTML); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
135 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
|
136 } |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
137 else if (file == "viewer.js") |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
138 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
139 std::string s; |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
140 Orthanc::EmbeddedResources::GetFileResource(s, Orthanc::EmbeddedResources::VIEWER_JS); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
141 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
|
142 } |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
143 else |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
144 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
145 cache_.Answer(output, file); |
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 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
149 |
1
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
152 #include <dcmtk/dcmdata/dcdeftag.h> |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
153 #include <dcmtk/dcmdata/dcfilefo.h> |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
154 #include <dcmtk/dcmdata/dcitem.h> |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
155 #include <dcmtk/dcmdata/dcsequen.h> |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
156 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
157 class Extent2D : public boost::noncopyable |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
158 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
159 private: |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
160 bool isEmpty_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
161 double x1_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
162 double y1_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
163 double x2_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
164 double y2_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
165 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
166 void CheckNotEmpty() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
167 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
168 if (isEmpty_) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
169 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
170 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
174 public: |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
175 Extent2D() : |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
176 isEmpty_(true), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
177 x1_(0), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
178 y1_(0), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
179 x2_(0), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
180 y2_(0) |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
184 bool IsEmpty() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
185 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
186 return isEmpty_; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
189 double GetMinX() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
190 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
191 CheckNotEmpty(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
192 return x1_; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
195 double GetMaxX() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
196 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
197 CheckNotEmpty(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
198 return x2_; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
201 double GetMinY() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
202 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
203 CheckNotEmpty(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
204 return y1_; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
207 double GetMaxY() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
208 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
209 CheckNotEmpty(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
210 return y2_; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
213 double GetWidth() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
214 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
215 CheckNotEmpty(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
216 return x2_ - x1_; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
219 double GetHeight() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
220 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
221 CheckNotEmpty(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
222 return y2_ - y1_; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
225 void Add(double x, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
226 double y) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
227 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
228 if (isEmpty_) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
229 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
230 x1_ = x2_ = x; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
231 y1_ = y2_ = y; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
232 isEmpty_ = false; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
233 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
234 else |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
235 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
236 x1_ = std::min(x1_, x); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
237 x2_ = std::max(x2_, x); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
238 y1_ = std::min(y1_, y); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
239 y2_ = std::max(y2_, y); |
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 }; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
243 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
244 static std::string GetStringValue(DcmItem& item, |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
245 const DcmTagKey& key) |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
246 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
247 const char* s = NULL; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
248 if (!item.findAndGetString(key, s).good() || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
249 s == NULL) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
250 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
251 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
252 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
253 else |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
254 { |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
255 return Orthanc::Toolbox::StripSpaces(s); |
1
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
260 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
|
261 Orthanc::ParsedDicomFile& source) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
262 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
263 target.clear(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
264 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
265 DcmSequenceOfItems* sequence = NULL; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
266 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
|
267 sequence == NULL) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
268 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
269 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
272 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
|
273 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
274 DcmItem* item = sequence->getItem(i); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
275 if (item == NULL) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
276 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
277 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
278 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
279 else |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
280 { |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
281 target.insert(GetStringValue(*item, DCM_ROIName)); |
1
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
287 static bool IsNear(double a, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
288 double b) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
289 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
290 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
|
291 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
292 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
293 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
294 class Vector3D |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
295 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
296 private: |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
297 double x_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
298 double y_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
299 double z_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
300 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
301 public: |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
302 Vector3D() : |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
303 x_(0), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
304 y_(0), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
305 z_(0) |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
309 Vector3D(double x, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
310 double y, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
311 double z) : |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
312 x_(x), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
313 y_(y), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
314 z_(z) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
315 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
316 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
317 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
318 Vector3D(const Vector3D& from, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
319 const Vector3D& to) : |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
320 x_(to.x_ - from.x_), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
321 y_(to.y_ - from.y_), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
322 z_(to.z_ - from.z_) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
323 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
324 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
325 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
326 double GetX() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
327 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
328 return x_; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
331 double GetY() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
332 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
333 return y_; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
336 double GetZ() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
337 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
338 return z_; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
341 double ComputeNorm() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
342 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
343 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
|
344 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
345 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
346 void Normalize() |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
347 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
348 double norm = ComputeNorm(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
349 if (!IsNear(norm, 0)) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
350 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
351 x_ /= norm; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
352 y_ /= norm; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
353 z_ /= norm; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
357 static Vector3D CrossProduct(const Vector3D& u, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
358 const Vector3D& v) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
359 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
360 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
|
361 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
|
362 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
|
363 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
364 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
365 static double DotProduct(const Vector3D& a, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
366 const Vector3D& b) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
367 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
368 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
|
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
374 static bool MyParseDouble(double& value, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
375 const std::string& s) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
376 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
377 #if 1 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
378 char* end = NULL; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
379 value = strtod(s.c_str(), &end); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
380 return (end == s.c_str() + s.size()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
381 #else |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
382 return Orthanc::SerializationToolbox::ParseDouble(value, s); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
383 #endif |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
387 class StructurePolygon : public boost::noncopyable |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
388 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
389 private: |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
390 std::string roiName_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
391 std::string referencedSopInstanceUid_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
392 uint8_t red_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
393 uint8_t green_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
394 uint8_t blue_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
395 std::vector<Vector3D> points_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
396 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
397 public: |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
398 StructurePolygon(Orthanc::ParsedDicomFile& dicom, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
399 unsigned long roiIndex, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
400 unsigned long contourIndex) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
401 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
402 DcmDataset& dataset = *dicom.GetDcmtkObject().getDataset(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
403 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
404 DcmItem* structure = NULL; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
405 DcmItem* roi = NULL; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
406 DcmItem* contour = NULL; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
407 DcmSequenceOfItems* referenced = NULL; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
408 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
409 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
|
410 structure == NULL || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
411 !dataset.findAndGetSequenceItem(DCM_ROIContourSequence, roi, roiIndex).good() || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
412 roi == NULL || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
413 !roi->findAndGetSequenceItem(DCM_ContourSequence, contour, contourIndex).good() || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
414 contour == NULL || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
415 !contour->findAndGetSequence(DCM_ContourImageSequence, referenced).good() || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
416 referenced == NULL || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
417 referenced->card() != 1) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
418 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
419 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
420 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
421 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
422 roiName_ = GetStringValue(*structure, DCM_ROIName); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
423 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
|
424 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
425 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
|
426 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
427 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
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 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
431 std::vector<std::string> tokens; |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
432 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
|
433 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
434 uint32_t r, g, b; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
435 if (tokens.size() != 3 || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
436 !Orthanc::SerializationToolbox::ParseFirstUnsignedInteger32(r, tokens[0]) || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
437 !Orthanc::SerializationToolbox::ParseFirstUnsignedInteger32(g, tokens[1]) || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
438 !Orthanc::SerializationToolbox::ParseFirstUnsignedInteger32(b, tokens[2]) || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
439 r > 255 || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
440 g > 255 || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
441 b > 255) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
442 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
443 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
446 red_ = r; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
447 green_ = g; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
448 blue_ = b; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
451 { |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
452 std::vector<std::string> tokens; |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
453 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
|
454 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
455 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
|
456 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
457 uint32_t countPoints; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
458 if (!Orthanc::SerializationToolbox::ParseUnsignedInteger32(countPoints, s) || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
459 tokens.size() != 3 * countPoints) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
460 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
461 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
464 points_.reserve(countPoints); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
465 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
466 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
|
467 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
468 double x, y, z; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
469 if (!MyParseDouble(x, tokens[i]) || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
470 !MyParseDouble(y, tokens[i + 1]) || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
471 !MyParseDouble(z, tokens[i + 2])) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
472 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
473 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
474 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
475 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
476 points_.push_back(Vector3D(x, y, z)); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
477 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
478 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
479 assert(points_.size() == countPoints); |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
483 const std::string& GetRoiName() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
484 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
485 return roiName_; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
488 const std::string& GetReferencedSopInstanceUid() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
489 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
490 return referencedSopInstanceUid_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
491 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
492 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
493 size_t GetPointsCount() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
494 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
495 return points_.size(); |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
498 const Vector3D& GetPoint(size_t i) const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
499 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
500 if (i >= points_.size()) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
501 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
502 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
503 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
504 else |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
505 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
506 return points_[i]; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
510 bool IsCoplanar(Vector3D& normal) const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
511 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
512 if (points_.size() < 3) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
513 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
514 return false; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
517 bool hasNormal = false; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
518 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
519 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
|
520 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
521 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
|
522 Vector3D(points_[2], points_[0])); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
523 if (!IsNear(normal.ComputeNorm(), 0)) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
524 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
525 normal.Normalize(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
526 hasNormal = true; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
530 if (!hasNormal) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
531 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
532 return false; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
535 double a = Vector3D::DotProduct(points_[0], normal); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
536 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
537 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
|
538 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
539 double b = Vector3D::DotProduct(points_[i], normal); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
540 if (!IsNear(a, b)) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
541 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
542 return false; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
546 return true; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
547 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
548 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
549 void Add(Extent2D& extent, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
550 const Vector3D& axisX, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
551 const Vector3D& axisY) const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
552 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
553 assert(IsNear(1, axisX.ComputeNorm())); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
554 assert(IsNear(1, axisY.ComputeNorm())); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
555 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
556 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
|
557 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
558 extent.Add(Vector3D::DotProduct(axisX, points_[i]), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
559 Vector3D::DotProduct(axisY, points_[i])); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
560 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
561 } |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
566 struct IsNearPredicate |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
567 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
568 bool operator() (const double& a, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
569 const double& b) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
570 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
571 return IsNear(a, b); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
572 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
573 }; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
574 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
575 static void RemoveDuplicateValues(std::vector<double>& v) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
576 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
577 IsNearPredicate predicate; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
578 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
|
579 v.erase(last, v.end()); |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
583 class StructureSet : public boost::noncopyable |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
584 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
585 private: |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
586 std::vector<StructurePolygon*> polygons_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
587 bool hasGeometry_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
588 Vector3D slicesNormal_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
589 double slicesSpacing_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
590 double minProjectionAlongNormal_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
591 double maxProjectionAlongNormal_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
592 std::string patientId_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
593 std::string studyInstanceUid_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
594 std::string seriesInstanceUid_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
595 std::string sopInstanceUid_; |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
596 bool hasFrameOfReferenceUid_; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
597 std::string frameOfReferenceUid_; |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
598 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
599 void ComputeGeometry() |
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 std::list<double> positionsList; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
602 hasGeometry_ = false; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
603 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
604 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
|
605 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
606 assert(polygons_[i] != NULL); |
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 Vector3D n; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
609 if (polygons_[i]->IsCoplanar(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 const Vector3D& point = polygons_[i]->GetPoint(0); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
612 double z = Vector3D::DotProduct(point, n); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
613 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
614 if (!hasGeometry_) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
615 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
616 hasGeometry_ = true; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
617 slicesNormal_ = n; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
618 minProjectionAlongNormal_ = z; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
619 maxProjectionAlongNormal_ = z; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
620 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
621 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
|
622 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
623 hasGeometry_ = false; |
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 // RT-STRUCT with non-parallel slices |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
626 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
627 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
628 else |
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 minProjectionAlongNormal_ = std::min(minProjectionAlongNormal_, z); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
631 maxProjectionAlongNormal_ = std::max(maxProjectionAlongNormal_, z); |
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 positionsList.push_back(Vector3D::DotProduct(n, point)); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
635 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
636 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
637 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
638 if (hasGeometry_) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
639 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
640 std::vector<double> positions(positionsList.begin(), positionsList.end()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
641 assert(!positions.empty()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
642 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
643 std::sort(positions.begin(), positions.end()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
644 RemoveDuplicateValues(positions); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
645 assert(!positions.empty()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
646 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
647 if (positions.size() == 1) |
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 hasGeometry_ = false; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
650 return; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
651 } |
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 std::vector<double> offsets; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
654 offsets.resize(positions.size() - 1); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
655 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
656 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
|
657 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
658 offsets[i] = positions[i + 1] - positions[i]; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
659 assert(offsets[i] > 0); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
660 } |
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 std::sort(offsets.begin(), offsets.end()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
663 RemoveDuplicateValues(offsets); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
664 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
665 slicesSpacing_ = offsets[0]; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
666 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
667 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
|
668 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
669 double d = offsets[i] / slicesSpacing_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
670 if (!IsNear(d, round(d))) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
671 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
672 // Irregular spacing between the slices |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
673 hasGeometry_ = false; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
674 break; |
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 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
678 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
679 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
680 void CheckHasGeometry() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
681 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
682 if (!hasGeometry_) |
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
685 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
686 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
687 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
688 public: |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
689 explicit StructureSet(Orthanc::ParsedDicomFile& dicom) : |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
690 hasGeometry_(false), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
691 slicesSpacing_(0), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
692 minProjectionAlongNormal_(0), |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
693 maxProjectionAlongNormal_(0), |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
694 hasFrameOfReferenceUid_(false) |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
695 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
696 DcmDataset& dataset = *dicom.GetDcmtkObject().getDataset(); |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
697 patientId_ = GetStringValue(dataset, DCM_PatientID); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
698 studyInstanceUid_ = GetStringValue(dataset, DCM_StudyInstanceUID); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
699 seriesInstanceUid_ = GetStringValue(dataset, DCM_SeriesInstanceUID); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
700 sopInstanceUid_ = GetStringValue(dataset, DCM_SOPInstanceUID); |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
701 |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
702 DcmSequenceOfItems* frame = NULL; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
703 if (!dataset.findAndGetSequence(DCM_ReferencedFrameOfReferenceSequence, frame).good() || |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
704 frame == NULL) |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
705 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
706 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
707 } |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
708 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
709 if (frame->card() == 1) |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
710 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
711 const char* v = NULL; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
712 if (frame->getItem(0)->findAndGetString(DCM_FrameOfReferenceUID, v).good() && |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
713 v != NULL) |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
714 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
715 hasFrameOfReferenceUid_ = true; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
716 frameOfReferenceUid_.assign(v); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
717 } |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
718 } |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
719 |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
720 DcmSequenceOfItems* rois = NULL; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
721 if (!dataset.findAndGetSequence(DCM_ROIContourSequence, rois).good() || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
722 rois == NULL) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
723 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
724 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
725 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
726 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
727 std::vector<DcmSequenceOfItems*> contours(rois->card()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
728 size_t countPolygons = 0; |
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 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
|
731 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
732 DcmSequenceOfItems* contour = NULL; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
733 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
|
734 contour == NULL) |
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
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 else |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
739 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
740 contours[i] = contour; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
741 countPolygons += contour->card(); |
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 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
744 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
745 polygons_.resize(countPolygons); |
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 size_t pos = 0; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
748 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
|
749 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
750 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
|
751 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
752 polygons_[pos] = new StructurePolygon(dicom, i, j); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
753 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
754 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
755 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
756 assert(pos == countPolygons); |
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 ComputeGeometry(); |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
761 ~StructureSet() |
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 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
|
764 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
765 assert(polygons_[i] != NULL); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
766 delete polygons_[i]; |
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 } |
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 const std::string& GetPatient() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
771 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
772 return patientId_; |
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 const std::string& GetStudyInstanceUid() 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 studyInstanceUid_; |
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 std::string& GetSeriesInstanceUid() 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 return seriesInstanceUid_; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
785 const std::string& GetSopInstanceUid() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
786 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
787 return sopInstanceUid_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
788 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
789 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
790 std::string HashStudy() const |
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 std::string s; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
793 Orthanc::Toolbox::ComputeSHA1(s, patientId_ + "|" + studyInstanceUid_); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
794 return s; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
795 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
796 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
797 size_t GetPolygonsCount() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
798 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
799 return polygons_.size(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
800 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
801 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
802 const StructurePolygon& GetPolygon(size_t i) const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
803 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
804 if (i >= polygons_.size()) |
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
807 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
808 else |
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 assert(polygons_[i] != NULL); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
811 return *polygons_[i]; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
812 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
813 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
814 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
815 bool HasGeometry() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
816 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
817 return hasGeometry_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
818 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
819 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
820 const Vector3D& GetSlicesNormal() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
821 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
822 CheckHasGeometry(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
823 return slicesNormal_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
824 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
825 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
826 double GetSlicesSpacing() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
827 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
828 CheckHasGeometry(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
829 return slicesSpacing_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
830 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
831 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
832 double GetMinProjectionAlongNormal() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
833 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
834 CheckHasGeometry(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
835 return minProjectionAlongNormal_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
836 } |
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 double GetMaxProjectionAlongNormal() const |
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 CheckHasGeometry(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
841 return maxProjectionAlongNormal_; |
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 double ProjectAlongNormal(const StructurePolygon& polygon) const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
845 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
846 CheckHasGeometry(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
847 return Vector3D::DotProduct(slicesNormal_, polygon.GetPoint(0)); |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
850 size_t GetSlicesCount() const |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
851 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
852 CheckHasGeometry(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
853 double c = (maxProjectionAlongNormal_ - minProjectionAlongNormal_) / slicesSpacing_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
854 assert(c >= 0); |
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 if (!IsNear(c, round(c))) |
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
859 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
860 else |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
861 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
862 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
|
863 } |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
866 bool LookupSliceIndex(size_t& slice, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
867 const StructurePolygon& polygon) const |
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 CheckHasGeometry(); |
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 double z = ProjectAlongNormal(polygon); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
872 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
873 if (z < minProjectionAlongNormal_ || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
874 z > maxProjectionAlongNormal_) |
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 return false; |
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 else |
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 double c = (z - minProjectionAlongNormal_) / slicesSpacing_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
881 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
882 if (IsNear(c, round(c))) |
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 slice = static_cast<size_t>(round(c)); |
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 else |
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 return false; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
890 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
891 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
892 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
893 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
894 bool LookupReferencedSopInstanceUid(std::string& sopInstanceUid) const |
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 if (HasGeometry()) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
897 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
898 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
|
899 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
900 assert(polygons_[i] != NULL); |
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 Vector3D n; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
903 if (polygons_[i]->IsCoplanar(n) && |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
904 Vector3D::DotProduct(n, slicesNormal_)) |
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 sopInstanceUid = polygons_[i]->GetReferencedSopInstanceUid(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
907 return true; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
908 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
909 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
910 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
911 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
912 return false; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
913 } |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
914 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
915 bool HasFrameOfReferenceUid() const |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
916 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
917 return hasFrameOfReferenceUid_; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
918 } |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
919 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
920 const std::string& GetFrameOfReferenceUid() const |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
921 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
922 if (hasFrameOfReferenceUid_) |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
923 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
924 return frameOfReferenceUid_; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
925 } |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
926 else |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
927 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
928 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
929 } |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
930 } |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
931 }; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
932 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
933 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
934 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
935 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
936 class XorFiller : public Orthanc::ImageProcessing::IPolygonFiller |
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 private: |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
939 Orthanc::ImageAccessor& target_; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
940 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
941 public: |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
942 XorFiller(Orthanc::ImageAccessor& target) : |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
943 target_(target) |
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 } |
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 virtual void Fill(int y, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
948 int x1, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
949 int x2) ORTHANC_OVERRIDE |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
950 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
951 assert(x1 <= x2); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
952 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
953 if (y >= 0 && |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
954 y < static_cast<int>(target_.GetHeight())) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
955 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
956 x1 = std::max(x1, 0); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
957 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
|
958 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
959 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
|
960 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
961 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
|
962 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
963 *p = (*p ^ 0xff); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
964 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
965 } |
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 }; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
968 |
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 static void EncodeSTL(std::string& target /* out */, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
971 vtkPolyData& mesh /* in */) |
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 // 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
|
974 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
975 Orthanc::ChunkedBuffer buffer; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
976 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
977 uint8_t header[80]; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
978 memset(header, 0, sizeof(header)); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
979 buffer.AddChunk(header, sizeof(header)); |
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 uint32_t n = mesh.GetNumberOfCells(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
982 buffer.AddChunk(&n, sizeof(n)); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
983 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
984 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
|
985 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
986 vtkCell* cell = mesh.GetCell(i); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
987 vtkTriangle* triangle = dynamic_cast<vtkTriangle*>(cell); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
988 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
989 double p0[3]; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
990 double p1[3]; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
991 double p2[3]; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
992 triangle->GetPoints()->GetPoint(0, p0); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
993 triangle->GetPoints()->GetPoint(1, p1); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
994 triangle->GetPoints()->GetPoint(2, p2); |
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 double normal[3]; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
997 vtkTriangle::ComputeNormal(p0, p1, p2, normal); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
998 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
999 float d[4 * 3] = { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1000 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
|
1001 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
|
1002 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
|
1003 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
|
1004 buffer.AddChunk(d, sizeof(d)); |
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 uint16_t a = 0; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1007 buffer.AddChunk(&a, sizeof(a)); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1008 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1009 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1010 buffer.Flatten(target); |
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 |
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 bool EncodeStructureSetMesh(std::string& stl, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1015 const StructureSet& structureSet, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1016 const std::set<std::string>& roiNames, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1017 unsigned int resolution, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1018 bool smooth) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1019 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1020 if (!structureSet.HasGeometry()) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1021 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1022 return false; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1023 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1024 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1025 if (resolution < 1) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1026 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1027 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
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 if (!IsNear(1, structureSet.GetSlicesNormal().ComputeNorm())) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1031 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1032 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1033 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1034 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1035 // 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
|
1036 Vector3D axisX(1, 0, 0); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1037 Vector3D axisY = Vector3D::CrossProduct(structureSet.GetSlicesNormal(), axisX); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1038 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1039 if (!IsNear(1, axisX.ComputeNorm()) || |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1040 !IsNear(1, axisY.ComputeNorm())) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1041 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1042 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1043 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1044 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1045 Extent2D extent; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1046 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
|
1047 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1048 structureSet.GetPolygon(i).Add(extent, axisX, axisY); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1049 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1050 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1051 const int depth = structureSet.GetSlicesCount(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1052 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1053 vtkNew<vtkImageData> volume; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1054 volume->SetDimensions(resolution, resolution, depth); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1055 volume->AllocateScalars(VTK_UNSIGNED_CHAR, 1); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1056 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1057 assert(sizeof(unsigned char) == 1); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1058 memset(volume->GetScalarPointer(), 0, resolution * resolution * depth); |
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 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
|
1061 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1062 const StructurePolygon& polygon = structureSet.GetPolygon(i); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1063 if (roiNames.find(polygon.GetRoiName()) == roiNames.end()) |
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 // 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
|
1066 continue; |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1069 size_t j; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1070 if (!structureSet.LookupSliceIndex(j, polygon)) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1071 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1072 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1073 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1074 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1075 std::vector<Orthanc::ImageProcessing::ImagePoint> points; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1076 points.reserve(polygon.GetPointsCount()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1077 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
|
1078 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1079 const Vector3D& point = polygon.GetPoint(j); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1080 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
|
1081 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
|
1082 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
|
1083 static_cast<int32_t>(std::floor(y)))); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1084 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1085 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1086 Orthanc::ImageAccessor slice; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1087 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
|
1088 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
|
1089 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1090 XorFiller filler(slice); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1091 Orthanc::ImageProcessing::FillPolygon(filler, points); |
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 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1094 vtkNew<vtkImageResize> resize; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1095 resize->SetOutputDimensions(resolution, resolution, resolution); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1096 resize->SetInputData(volume.Get()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1097 resize->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 resize->GetOutput()->SetSpacing( |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1100 extent.GetWidth() / static_cast<double>(resolution), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1101 extent.GetHeight() / static_cast<double>(resolution), |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1102 (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
|
1103 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1104 // TODO |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1105 // resize->GetOutput()->SetOrigin() |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1106 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1107 vtkNew<vtkImageConstantPad> padding; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1108 padding->SetConstant(0); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1109 padding->SetOutputNumberOfScalarComponents(1); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1110 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
|
1111 padding->SetInputData(resize->GetOutput()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1112 padding->Update(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1113 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1114 vtkNew<vtkMarchingCubes> surface; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1115 surface->SetInputData(padding->GetOutput()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1116 surface->ComputeNormalsOn(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1117 surface->SetValue(0, 128 /*isoValue*/); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1118 surface->Update(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1119 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1120 if (smooth) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1121 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1122 vtkNew<vtkSmoothPolyDataFilter> smoothFilter; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1123 // Apply volume smoothing |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1124 // 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
|
1125 smoothFilter->SetInputConnection(surface->GetOutputPort()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1126 smoothFilter->SetNumberOfIterations(15); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1127 smoothFilter->SetRelaxationFactor(0.1); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1128 smoothFilter->FeatureEdgeSmoothingOff(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1129 smoothFilter->BoundarySmoothingOn(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1130 smoothFilter->Update(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1131 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1132 vtkNew<vtkPolyDataNormals> normalGenerator; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1133 normalGenerator->SetInputConnection(smoothFilter->GetOutputPort()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1134 normalGenerator->ComputePointNormalsOn(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1135 normalGenerator->ComputeCellNormalsOn(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1136 normalGenerator->Update(); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1137 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1138 EncodeSTL(stl, *normalGenerator->GetOutput()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1139 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1140 else |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1141 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1142 EncodeSTL(stl, *surface->GetOutput()); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1143 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1144 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1145 return true; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1146 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1147 |
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 static Orthanc::ParsedDicomFile* LoadInstance(const std::string& instanceId) |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1150 { |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1151 std::string dicom; |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1152 |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1153 if (!OrthancPlugins::RestApiGetString(dicom, "/instances/" + instanceId + "/file", false)) |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1154 { |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1155 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1156 } |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1157 else |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1158 { |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1159 return new Orthanc::ParsedDicomFile(dicom); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1160 } |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1161 } |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1162 |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1163 |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1164 void ListStructures(OrthancPluginRestOutput* output, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1165 const char* url, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1166 const OrthancPluginHttpRequest* request) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1167 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1168 if (request->method != OrthancPluginHttpMethod_Get) |
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 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "GET"); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1171 return; |
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 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1174 const std::string instanceId(request->groups[0]); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1175 |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1176 std::unique_ptr<Orthanc::ParsedDicomFile> dicom(LoadInstance(instanceId)); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1177 |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1178 std::set<std::string> names; |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1179 ListStructuresNames(names, *dicom); |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1180 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1181 Json::Value answer = Json::arrayValue; |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1182 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1183 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
|
1184 { |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1185 answer.append(*it); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1186 } |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1187 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1188 std::string s = answer.toStyledString(); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1189 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
|
1190 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1191 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1192 |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1193 static void AddDefaultTagValue(Json::Value& target, |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1194 const Orthanc::DicomTag& tag, |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1195 const std::string& value) |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1196 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1197 if (!target.isMember(tag.Format())) |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1198 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1199 target[tag.Format()] = value; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1200 } |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1201 } |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1202 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1203 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1204 static void AddDefaultTagValue(Json::Value& target, |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1205 const DcmTagKey& tag, |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1206 const std::string& value) |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1207 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1208 AddDefaultTagValue(target, Orthanc::DicomTag(tag.getGroup(), tag.getElement()), value); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1209 } |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1210 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1211 |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1212 void Encode(OrthancPluginRestOutput* output, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1213 const char* url, |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1214 const OrthancPluginHttpRequest* request) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1215 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1216 static const char* const KEY_INSTANCE = "Instance"; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1217 static const char* const KEY_RESOLUTION = "Resolution"; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1218 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
|
1219 static const char* const KEY_SMOOTH = "Smooth"; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1220 static const char* const KEY_TAGS = "Tags"; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1221 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1222 if (request->method != OrthancPluginHttpMethod_Post) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1223 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1224 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "POST"); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1225 return; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1226 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1227 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1228 Json::Value body; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1229 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
|
1230 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1231 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1232 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1233 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1234 const 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
|
1235 const bool smooth = (body.isMember(KEY_SMOOTH) ? |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1236 Orthanc::SerializationToolbox::ReadBoolean(body, KEY_SMOOTH) : |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1237 true /* smooth by default */); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1238 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
|
1239 Orthanc::SerializationToolbox::ReadUnsignedInteger(body, KEY_RESOLUTION) : |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1240 256 /* default value */); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1241 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1242 std::set<std::string> roiNames; |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1243 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
|
1244 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1245 std::unique_ptr<Orthanc::ParsedDicomFile> dicom(LoadInstance(instanceId)); |
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 StructureSet structureSet(*dicom); |
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 std::string stl; |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1250 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
|
1251 { |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1252 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
|
1253 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1254 else |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1255 { |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1256 std::string content; |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1257 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
|
1258 |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1259 Json::Value normalized = Json::objectValue; |
3
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 if (body.isMember(KEY_TAGS)) |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1262 { |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1263 const Json::Value& tags = body[KEY_TAGS]; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1264 if (tags.type() != Json::objectValue) |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1265 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1266 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest, "Tags must be provided as a JSON object"); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1267 } |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1268 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1269 std::vector<std::string> keys = tags.getMemberNames(); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1270 for (size_t i = 0; i < keys.size(); i++) |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1271 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1272 const Orthanc::DicomTag tag = Orthanc::FromDcmtkBridge::ParseTag(keys[i]); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1273 normalized[tag.Format()] = tags[keys[i]]; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1274 } |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1275 } |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1276 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1277 if (!normalized.isMember(Orthanc::DICOM_TAG_SERIES_DESCRIPTION.Format())) |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1278 { |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1279 std::string description; |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1280 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1281 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
|
1282 { |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1283 description += ": "; |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1284 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1285 else |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1286 { |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1287 description.clear(); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1288 } |
2
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1289 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1290 bool first = true; |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1291 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
|
1292 { |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1293 if (first) |
2
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1294 { |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1295 first = false; |
2
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1296 } |
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1297 else |
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1298 { |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1299 description += ", "; |
2
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1300 } |
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1301 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1302 description += *it; |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1303 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1304 |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1305 normalized[Orthanc::DICOM_TAG_SERIES_DESCRIPTION.Format()] = description; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1306 } |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1307 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1308 AddDefaultTagValue(normalized, Orthanc::DICOM_TAG_SERIES_NUMBER, "1"); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1309 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1310 std::string s; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1311 if (structureSet.HasFrameOfReferenceUid()) |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1312 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1313 s = structureSet.GetFrameOfReferenceUid(); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1314 } |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1315 else |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1316 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1317 s = Orthanc::FromDcmtkBridge::GenerateUniqueIdentifier(Orthanc::ResourceType_Instance); |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1318 } |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1319 |
4
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1320 AddDefaultTagValue(normalized, Orthanc::DICOM_TAG_FRAME_OF_REFERENCE_UID, s); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1321 AddDefaultTagValue(normalized, Orthanc::DICOM_TAG_INSTANCE_NUMBER, "1"); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1322 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1323 const std::string title = "STL model generated from DICOM RT-STRUCT"; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1324 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1325 AddDefaultTagValue(normalized, DCM_BurnedInAnnotation, "NO"); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1326 AddDefaultTagValue(normalized, DCM_DeviceSerialNumber, ORTHANC_STL_VERSION); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1327 AddDefaultTagValue(normalized, DCM_DocumentTitle, title); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1328 AddDefaultTagValue(normalized, DCM_Manufacturer, "Orthanc STL plugin"); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1329 AddDefaultTagValue(normalized, DCM_ManufacturerModelName, "Orthanc STL plugin"); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1330 AddDefaultTagValue(normalized, DCM_PositionReferenceIndicator, ""); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1331 AddDefaultTagValue(normalized, DCM_SoftwareVersions, ORTHANC_STL_VERSION); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1332 AddDefaultTagValue(normalized, DCM_ConceptNameCodeSequence, ""); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1333 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1334 std::string date, time; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1335 Orthanc::SystemToolbox::GetNowDicom(date, time, true /* use UTC time (not local time) */); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1336 AddDefaultTagValue(normalized, DCM_AcquisitionDateTime, date + time); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1337 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1338 const Orthanc::DicomTag MEASUREMENT_UNITS_CODE_SEQUENCE(DCM_MeasurementUnitsCodeSequence.getGroup(), |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1339 DCM_MeasurementUnitsCodeSequence.getElement()); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1340 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1341 if (!normalized.isMember(MEASUREMENT_UNITS_CODE_SEQUENCE.Format())) |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1342 { |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1343 Json::Value item; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1344 item["CodeValue"] = "mm"; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1345 item["CodingSchemeDesignator"] = "UCUM"; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1346 item["CodeMeaning"] = title; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1347 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1348 normalized[MEASUREMENT_UNITS_CODE_SEQUENCE.Format()].append(item); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1349 } |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1350 |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1351 Json::Value create; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1352 create["Content"] = content; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1353 create["Parent"] = structureSet.HashStudy(); |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1354 create["Tags"] = normalized; |
5ee4448a8ff8
generated STL pass dciodvfy
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3
diff
changeset
|
1355 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1356 Json::Value answer; |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1357 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
|
1358 { |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1359 std::string s = answer.toStyledString(); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1360 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
|
1361 } |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1362 else |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1363 { |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1364 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
|
1365 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1366 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1367 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1368 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1369 |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1370 void ExtractStl(OrthancPluginRestOutput* output, |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1371 const char* url, |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1372 const OrthancPluginHttpRequest* request) |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1373 { |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1374 if (request->method != OrthancPluginHttpMethod_Get) |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1375 { |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1376 OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "GET"); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1377 return; |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1378 } |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1379 |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1380 const std::string instanceId(request->groups[0]); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1381 |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1382 std::unique_ptr<Orthanc::ParsedDicomFile> dicom(LoadInstance(instanceId)); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1383 DcmDataset& dataset = *dicom->GetDcmtkObject().getDataset(); |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1384 |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1385 std::string stl; |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1386 if (GetStringValue(dataset, DCM_MIMETypeOfEncapsulatedDocument) != Orthanc::MIME_STL || |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1387 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
|
1388 !dicom->GetTagValue(stl, Orthanc::DICOM_TAG_ENCAPSULATED_DOCUMENT)) |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1389 { |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1390 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
|
1391 } |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1392 else |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1393 { |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1394 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1395 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
|
1396 } |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1397 } |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1398 |
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1399 |
0
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1400 extern "C" |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1401 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1402 ORTHANC_PLUGINS_API int32_t OrthancPluginInitialize(OrthancPluginContext* context) |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1403 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1404 OrthancPlugins::SetGlobalContext(context); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1405 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1406 /* Check the version of the Orthanc core */ |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1407 if (OrthancPluginCheckVersion(OrthancPlugins::GetGlobalContext()) == 0) |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1408 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1409 char info[1024]; |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1410 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
|
1411 OrthancPlugins::GetGlobalContext()->orthancVersion, |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1412 ORTHANC_PLUGINS_MINIMAL_MAJOR_NUMBER, |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1413 ORTHANC_PLUGINS_MINIMAL_MINOR_NUMBER, |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1414 ORTHANC_PLUGINS_MINIMAL_REVISION_NUMBER); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1415 OrthancPluginLogError(OrthancPlugins::GetGlobalContext(), info); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1416 return -1; |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1417 } |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1418 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1419 #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
|
1420 Orthanc::Logging::InitializePluginContext(context); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1421 #else |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1422 Orthanc::Logging::Initialize(context); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1423 #endif |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1424 |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1425 Orthanc::InitializeFramework("", false); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1426 |
0
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1427 hasCreateDicomStl_ = OrthancPlugins::CheckMinimalOrthancVersion(1, 12, 1); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1428 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1429 if (!hasCreateDicomStl_) |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1430 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1431 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
|
1432 << ") 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
|
1433 } |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1434 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1435 OrthancPluginSetDescription(context, "STL plugin for Orthanc."); |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1436 |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1437 OrthancPlugins::RegisterRestCallback<ServeFile>("/stl/app/(.*)", true); |
3
0fb06c6a6c87
added route "/instances/{id}/stl"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2
diff
changeset
|
1438 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
|
1439 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
|
1440 |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1441 if (hasCreateDicomStl_) |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1442 { |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1443 OrthancPlugins::RegisterRestCallback<Encode>("/stl/encode", true); |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1444 } |
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1445 |
2
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1446 // 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
|
1447 std::string explorer; |
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1448 |
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1449 { |
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1450 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
|
1451 |
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1452 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
|
1453 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
|
1454 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
|
1455 |
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1456 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
|
1457 } |
2bdb9acb7dcf
added STL viewer button at instance level too
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1
diff
changeset
|
1458 |
0
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1459 return 0; |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1460 } |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1461 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1462 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1463 ORTHANC_PLUGINS_API void OrthancPluginFinalize() |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1464 { |
1
0f03a8a0bd6f
encoding of RT-STRUCT as STL
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
1465 Orthanc::FinalizeFramework(); |
0
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1466 } |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1467 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1468 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1469 ORTHANC_PLUGINS_API const char* OrthancPluginGetName() |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1470 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1471 return "stl"; |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1472 } |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1473 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1474 |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1475 ORTHANC_PLUGINS_API const char* OrthancPluginGetVersion() |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1476 { |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1477 return ORTHANC_STL_VERSION; |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1478 } |
4e889a8e8be2
initial commit of the viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1479 } |