opensurgsim
PlyReader.h
1 // This file is a part of the OpenSurgSim project.
2 // Copyright 2013, SimQuest Solutions Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 
16 #ifndef SURGSIM_DATASTRUCTURES_PLYREADER_H
17 #define SURGSIM_DATASTRUCTURES_PLYREADER_H
18 
19 #include <string>
20 #include <functional>
21 #include <memory>
22 #include <unordered_map>
23 #include <vector>
24 
25 namespace SurgSim
26 {
27 namespace DataStructures
28 {
29 
30 class PlyReaderDelegate;
31 
83 
84 
85 class PlyReader
86 {
87 public:
89  enum Type
90  {
91  TYPE_INVALID = 0,
92  TYPE_CHAR,
93  TYPE_SHORT,
94  TYPE_INT,
95  TYPE_UNSIGNED_CHAR,
96  TYPE_UNSIGNED_SHORT,
97  TYPE_UNSIGNED_INT,
98  TYPE_FLOAT,
99  TYPE_DOUBLE,
100  TYPE_COUNT
101  };
102 
107  typedef std::function<void* (const std::string&, size_t)> StartElementCallbackType;
108 
111  typedef std::function<void (const std::string&)> StandardCallbackType;
112 
115  explicit PlyReader(const std::string& filename);
116 
118  virtual ~PlyReader();
119 
122  bool isValid() const;
123 
132  bool requestElement(const std::string& elementName,
133  std::function<void* (const std::string&, size_t)> startElementCallback,
134  std::function<void (const std::string&)> processElementCallback,
135  std::function<void (const std::string&)> endElementCallback);
136 
150  bool requestScalarProperty(const std::string& elementName, const std::string& propertyName,
151  int dataType, int dataOffset);
152 
167  bool requestListProperty(const std::string& elementName,
168  const std::string& propertyName,
169  int dataType, int dataOffset,
170  int countType, int countOffset);
171 
175  bool hasElement(const std::string& elementName) const;
176 
181  bool hasProperty(const std::string& elementName, const std::string& propertyName) const;
182 
187  bool isScalar(const std::string& elementName, const std::string& propertyName) const;
188 
192  bool parseWithDelegate(std::shared_ptr<PlyReaderDelegate> delegate);
193 
195  void setStartParseFileCallback(std::function<void (void)> startParseFileCallback);
196 
198  void setEndParseFileCallback(std::function<void (void)> endParseFileCallback);
199 
203  bool setDelegate(std::shared_ptr<PlyReaderDelegate> delegate);
204 
206  void parseFile();
207 
208 private:
209  friend class PlyReaderTests;
210 
221  bool requestProperty(const std::string& elementName,
222  const std::string& propertyName,
223  int dataType, int dataOffset,
224  int countType, int countOffset);
225 
227  std::string m_filename;
228 
230  struct PropertyInfo
231  {
232  std::string propertyName;
233  int dataType = -1;
234  int dataOffset = -1;
235  int countType = -1;
236  int countOffset = -1;
237  };
238 
240  struct ElementInfo
241  {
242  std::string name;
243  StartElementCallbackType startElementCallback;
244  StandardCallbackType processElementCallback;
245  StandardCallbackType endElementCallback;
246  std::vector<PropertyInfo> requestedProperties;
247  };
248 
249  std::unordered_map<std::string, ElementInfo> m_requestedElements;
250 
253  struct Data;
254  std::unique_ptr<Data> m_data;
256 
258  std::shared_ptr<PlyReaderDelegate> m_delegate;
259 
261  std::function<void(void)> m_startParseFileCallback;
262 
264  std::function<void(void)> m_endParseFileCallback;
265 };
266 
267 } // DataStructures
268 } // SurgSim
269 
270 #endif // SURGSIM_DATASTRUCTURES_PLYREADER_H
void parseFile()
Parse the file.
Definition: PlyReader.cpp:214
Definition: PlyReaderTests.cpp:46
Wraps glewInit() to separate the glew opengl definitions from the osg opengl definitions only imgui n...
Definition: AddRandomSphereBehavior.cpp:36
bool hasProperty(const std::string &elementName, const std::string &propertyName) const
Query if &#39;elementName&#39; has the given property.
Definition: PlyReader.cpp:353
virtual ~PlyReader()
Destructor.
Definition: PlyReader.cpp:77
bool hasElement(const std::string &elementName) const
Query if this elementName is in the .ply file.
Definition: PlyReader.cpp:346
bool requestScalarProperty(const std::string &elementName, const std::string &propertyName, int dataType, int dataOffset)
Request a scalar property for parsing.
Definition: PlyReader.cpp:121
void setStartParseFileCallback(std::function< void(void)> startParseFileCallback)
Register callback to be called at the begining of parseFile.
Definition: PlyReader.cpp:135
std::function< void(const std::string &)> StandardCallbackType
The callback that is used for the processing and the end of processing, the parameter passed is the n...
Definition: PlyReader.h:111
Definition: PlyReader.cpp:34
Wrapper for the C .ply file parser This class wraps the main functionality for the original C ...
Definition: PlyReader.h:85
Type
Values that represent the data type/size of requested data.
Definition: PlyReader.h:89
PlyReader(const std::string &filename)
Constructor.
Definition: PlyReader.cpp:63
bool setDelegate(std::shared_ptr< PlyReaderDelegate > delegate)
Sets a delegate for parsing.
Definition: PlyReader.cpp:199
bool requestListProperty(const std::string &elementName, const std::string &propertyName, int dataType, int dataOffset, int countType, int countOffset)
Request a list property for parsing.
Definition: PlyReader.cpp:127
bool isScalar(const std::string &elementName, const std::string &propertyName) const
Query if the property of the give element is scalar.
Definition: PlyReader.cpp:367
bool requestElement(const std::string &elementName, std::function< void *(const std::string &, size_t)> startElementCallback, std::function< void(const std::string &)> processElementCallback, std::function< void(const std::string &)> endElementCallback)
Request element to be processed during parsing.
Definition: PlyReader.cpp:97
std::function< void *(const std::string &, size_t)> StartElementCallbackType
The callback that is being used to indicate the start of an element, the parameters that are passed i...
Definition: PlyReader.h:107
bool isValid() const
Query if this object is valid.
Definition: PlyReader.cpp:92
void setEndParseFileCallback(std::function< void(void)> endParseFileCallback)
Register callback to be called at the end of parseFile.
Definition: PlyReader.cpp:140
bool parseWithDelegate(std::shared_ptr< PlyReaderDelegate > delegate)
Sets a delegate for parsing and then parse the file.
Definition: PlyReader.cpp:336