vrcore  0.45
visuReal Messkern
 All Classes Files Functions Variables
JsonTranslator.h
Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 //
3 // visuReal Zentrierdaten-Ermittlung
4 //
5 // Original file: JsonTranslator.h
6 //
7 // Robert Rossmair, 2011-2013
8 //
9 // Copyright © 2011 Ollendorf Measurement Systems
10 // Dipl.-Ing. Hans-Joachim Ollendorf
11 // Zur Springe 5
12 // 39517 Brunkau
13 // Germany
14 //
15 //------------------------------------------------------------------------------
16 
17 #ifndef JSONTRANSLATOR_H
18 #define JSONTRANSLATOR_H
19 
20 #include <memory>
21 #include <math.h>
22 #include <limits>
23 #include "chain/ApiTypes.h"
24 #include "StatusUtils.h"
26 
29 const double indeterminate = std::numeric_limits<double>::quiet_NaN();
30 
31 namespace vr
32 {
33 
34 const size_t FRONTAL_MARK_COUNT = 5;
35 const size_t NEAR_PD_MARK_COUNT = 3;
36 const size_t LATERAL_MARK_COUNT = 3;
37 const size_t EYE_COUNT = 2;
38 const size_t LENSBOX_CORNER_COUNT = 4;
39 const size_t WINDROSE_DIRECTION_COUNT = 4;
40 const size_t LATERALBOX_CORNER_COUNT = 3;
41 const size_t STRUT_LENSCONTOUR_INTERSECTION_COUNT = 4;
42 
43 const json_string jsCameraAttitude = "camera_attitude";
44 const json_string jsDetails = "details";
45 
46 const json_string jsExposureArrangement = "exposure_arrangement";
47 
48 const json_string jsImages = "images";
49 const json_string jsFile = "file";
50 const json_string jsImage = "image";
51 const json_string jsOpticalAxis = "optical_axis";
52 const json_string jsStatus = "status";
53 const json_string jsResultImage = "result_image";
54 const json_string jsSize = "size";
55 const json_string jsFront = "front";
56 const json_string jsNearFront = "near_front";
57 const json_string jsRight = "right";
58 const json_string jsLeft = "left";
59 
60 const json_string jsMethod = "method";
61 
62 const json_string jsNoMethod = "";
63 const json_string jsFrontOnly = "front";
64 const json_string jsRightSideFront = "front+right";
65 const json_string jsFrontLeftSide = "front+left";
66 const json_string jsRightSideFrontLeftSide = "front+right+left";
67 
68 const json_string jsRealizedSize = "realised_size";
69 const json_string jsMinimumSize = "minimum_size";
70 const json_string jsMaximumSize = "maximum_size";
71 const json_string jsMinimumMarkMargin = "minimum_mark_margin";
72 
73 const json_string jsTransformation = "transformation";
74 const json_string jsImageSize = "image_size";
75 const json_string jsClippingOffset = "clipping_offset";
76 const json_string jsPivot = "pivot";
77 const json_string jsAngle = "angle";
78 const json_string jsScaleFactor = "scale_factor";
79 const json_string jsProgressiveCorridorLength = "progressive_corridor_length";
80 const json_string jsComputationModel = "computation_model";
81 
82 const json_string jsMarks = "marks";
83 const json_string jsIris = "iris";
84 const json_string jsLens = "lens";
85 const json_string jsLensL = "lens_L";
86 const json_string jsLensR = "lens_R";
87 const json_string jsLensMarginL = "lens_margin_L";
88 const json_string jsLensMarginR = "lens_margin_R";
89 const json_string jsCenter = "center";
90 const json_string jsDiameter = "diameter";
91 const json_string jsSpherical = "spherical";
92 const json_string jsAspheric = "aspheric";
93 const json_string jsProgressive = "progressive";
94 const json_string jsMETS = "hoya_mets";
95 const json_string jsBox = "box";
96 const json_string jsPlanePixelsPerMm = "plane_pixels_per_mm";
97 const json_string jsFaceFormAngleRef = "face_form_angle_ref";
98 const json_string jsInfantGlassesConfig = "infant_glasses_config";
99 const json_string jsMarkMarginInPercent = "percentage_mark_margin";
100 const json_string jsProgressiveCorridorTop = "progressive_corridor_top";
101 const json_string jsProgressiveCorridorBottom = "progressive_corridor_bottom";
102 const json_string jsStrutLensContourIntersections = "strut_lens_contour_intersections";
104 const json_string jsLensBevels = "lens_bevels";
105 const json_string jsLensThickness = "lens_thickness";
106 const json_string jsResults = "results";
107 const json_string jsPreciseResults = "precise_results";
108 
109 const json_string jsGrooveDepth [GROOVE_DEPTH_CLASS] = {
110  "groove depth: 0",
111  "groove depth: 0.5 mm",
112  "groove depth: 0.7 mm"
113 };
114 
115 const json_string jsHeadRotationCompensationOff = "head rotation compensation: off";
116 const json_string jsHeadRotationCompensationOn = "head rotation compensation: on";
117 const json_string jsReadingDistance = "reading_distance";
118 const json_string jsVarioInsetTop = "up";
119 const json_string jsVarioInsetMiddle = "middle";
120 const json_string jsVarioInsetBottom = "down";
121 
122 JSONNode& getJsonNode(JSONNode& parent, char nodeType, const json_string& name, bool clear = false);
123 JSONNode& getEmptyJsonNode(JSONNode& parent, const json_string& name);
124 JSONNode& getEmptyJsonArray(JSONNode& parent, const json_string& name);
125 
126 //------------------------------------------------------------------------------
127 
134 template<size_t n> class IntArray
135 {
136 public:
137  IntArray(const json_string& key, int initValue = 0)
138  {
139  for (size_t i = 0; i < n; i++)
140  {
141  values[i] = initValue;
142  }
143  key_ = key;
144  };
145 
146  bool tryReadFromJson(const JSONNode& node)
147  {
148  if (node.name() == key_) {
149 
150  JSONNode::const_iterator i = node.begin();
151 
152  for (size_t j = 0; j < n; j++) {
153  if (i != node.end()) {
154  values[j] = i->as_int();
155  ++i;
156  };
157  };
158  return true;
159  }
160  return false;
161  };
162 
163  void writeToJson(JSONNode& parent)
164  {
165  JSONNode& node = getEmptyJsonArray(parent, key_);
166  JSONNode value(JSON_NUMBER);
167 
168  for (size_t j = 0; j < n; j++) {
169  value = values[j];
170  node.push_back(value);
171  };
172  }
173 
174  void writeToVrCore(void (*setter)(const int values[])) { setter(values); };
175  void writeToVrCore(void (*setter)(const int values[], const LateralSide partialImage)) { setter(values, RIGHT); };
176  void readFromVrCore(void (*getter)(int values[])) { getter(values); };
177 private:
178  int values[n];
179  json_string key_;
180 };
181 
182 //------------------------------------------------------------------------------
183 
190 template<size_t n> class IntArrayWithStatus
191 {
192 public:
193  IntArrayWithStatus(const json_string& key, int initValue = 0)
194  {
195  for (size_t i = 0; i < n; i++)
196  {
197  values[i] = initValue;
198  }
199  key_ = key;
200  info_ = guessed;
201  };
202 
203  bool tryReadFromJson(const JSONNode& node)
204  {
205  if (node.name() == key_) {
206  JSONNode::const_iterator k = node.begin();
207  readStatusFromJson(*k++, info_);
208  JSONNode::const_iterator i = (*k).begin();
209  for (size_t j = 0; j < n; j++) {
210  if (i != (*k).end()) {
211  values[j] = i->as_int();
212  ++i;
213  };
214  };
215  return true;
216  }
217  return false;
218  };
219 
220  void writeArrayToJson(JSONNode& parent) const
221  {
222  JSONNode node(JSON_ARRAY);
223 
224  if (!(parent.name() == key_))
225  node.set_name(key_);
226 
227  JSONNode value(JSON_NUMBER);
228 
229  for (size_t j = 0; j < n; j++) {
230  value = values[j];
231  node.push_back(value);
232  };
233 
234  parent.push_back(node);
235  }
236 
237  void writeToJson(JSONNode& parent)
238  {
239  JSONNode& node = getEmptyJsonArray(parent, key_);
240 
241  JSONNode s(JSON_STRING);
242  writeStatusToJson(s, info_);
243  node.push_back(s);
244 
245  writeArrayToJson(node);
246  /*
247  JSONNode& array = getEmptyJsonArray(node, key_);
248  JSONNode value(JSON_NUMBER);
249 
250  for (size_t j = 0; j < n; j++) {
251  value = values[j];
252  array.push_back(value);
253  };
254  */
255  }
256 
257  void writeToVrCore(void (*setter)(const int values[], const StatusInfo info_)) { setter(values, info_); };
258  void readFromVrCore(StatusInfo (*getter)(int values[])) { info_ = getter(values); };
259  int& operator [](size_t i) { return values[i]; };
260 private:
261  int values[n];
262  json_string key_;
263  StatusInfo info_;
264 };
265 
266 //------------------------------------------------------------------------------
267 
274 template<size_t n> class DoubleArray
275 {
276 public:
277  DoubleArray(const json_string& key)
278  {
279  for (size_t i = 0; i < n; i++)
280  {
281  values_[i] = indeterminate;
282  }
283  key_ = key;
284  };
285 
286  bool tryReadFromJson(const JSONNode& node)
287  {
288  if (node.name() == key_) {
289  JSONNode::const_iterator i = node.begin();
290  for (size_t j = 0; j < n; j++) {
291  if (i != node.end()) {
292  values_[j] = i->as_float();
293  ++i;
294  };
295  };
296  return true;
297  }
298  return false;
299  };
300 
301  void writeToJson(JSONNode& parent)
302  {
303  JSONNode& node = getEmptyJsonArray(parent, key_);
304  JSONNode value(JSON_NUMBER);
305 
306  for (size_t j = 0; j < n; j++) {
307  double x = values_[j];
308  if (!std::isfinite(x))
309  value = JSON_NULL;
310  else
311  value = x;
312  node.push_back(value);
313  };
314  }
315 
316  void writeToVrCore(void (*setter)(const double values[]))
317  {
318  if (values_[0] == values_[0]) // !NaN
319  setter(values_);
320  };
321  void readFromVrCore(void (*getter)(double values[])) { getter(values_); };
322 
323  double& operator [](size_t i) { return values_[i]; };
324 private:
325  double values_[n];
326  json_string key_;
327 };
328 
329 //------------------------------------------------------------------------------
330 
337 template<size_t n> class CoordinateSet
338 {
339 public:
340  CoordinateSet()
341  {
342  for (size_t i = 0; i < n; i++)
343  {
344 #if 1
345  coordinates[i][0] = 0.0;
346  coordinates[i][1] = 0.0;
347  info[i] = todo;
348 #else
349  coordinates[i][0] = indeterminate;
350  coordinates[i][1] = indeterminate;
351  info[i] = invalid;
352 #endif
353  }
354  };
355  void readFromJson(const JSONNode& node, const char* id[n])
356  {
357  for (size_t i = 0; i < n; i++)
358  {
359  JSONNode j = node[id[i]];
360  readStatusFromJson(j[0], info[i]);
361  coordinates[i][0] = (j[1][0].as_float());
362  coordinates[i][1] = (j[1][1].as_float());
363  }
364  };
365 
366  void writeToJson(JSONNode& node, const char* id[n])
367  {
368  //if (isValid())
369  for (size_t i = 0; i < n; i++)
370  {
371  JSONNode a(JSON_ARRAY);
372  a.set_name(id[i]);
373 
374  JSONNode s(JSON_STRING);
375  writeStatusToJson(s, info[i]);
376  a.push_back(s);
377 
378  JSONNode a1(JSON_ARRAY);
379  JSONNode c(JSON_NUMBER);
380  double x = coordinates[i][0];
381  if (!std::isfinite(x))
382  c = JSON_NULL;
383  else
384  c = x;
385  a1.push_back(c);
386  x = coordinates[i][1];
387  if (!std::isfinite(x))
388  x = JSON_NULL;
389  c = x;
390  a1.push_back(c);
391  a.push_back(a1);
392 
393  node.push_back(a);
394  }
395  };
396  void writeToVrCore(void (*setter)(const double points[][2], const StatusInfo info[]))
397  {
398  if (isValid())
399  setter(coordinates, info);
400  };
401  void writeToVrCore(void (*setter)(const double points[][2], const StatusInfo info[], const LateralSide partialImage))
402  {
403  if (isValid())
404  setter(coordinates, info, RIGHT);
405  };
406  void writeToVrCore(void (*setter)(const double points[][2], const StatusInfo info[], VarioInsetPos, size_t), VarioInsetPos p, size_t i)
407  {
408  if (isValid())
409  setter(coordinates, info, p, i);
410  };
411  void readFromVrCore(void (*getter)(double points[][2], StatusInfo info[])) { getter(coordinates, info); };
412  void readFromVrCore(void (*getter)(double points[][2], StatusInfo info[], const LateralSide partialImage)) { getter(coordinates, info, RIGHT); };
413  void readFromVrCore(void (*getter)(double points[][2], StatusInfo info[], VarioInsetPos, size_t), VarioInsetPos p, size_t i)
414  { getter(coordinates, info, p, i); };
415  bool isValid() { return info[0] != invalid; };
416 
417  void getPoints(std::vector<cv::Point2d>& points) const {
418  for (size_t i = 0; i < n; i++) {
419  points.push_back(cv::Point2d(
420  coordinates[i][0],
421  coordinates[i][1]));
422  };
423  };
424 
425  void get(double points[n][2], StatusInfo statusInfo[n]) {
426  for (size_t i = 0; i < n; i++) {
427  points[i][0] = coordinates[i][0];
428  points[i][1] = coordinates[i][1];
429  statusInfo[i] = info[i];
430  };
431  };
432  void set(double points[n][2], StatusInfo statusInfo[n]) {
433  for (size_t i = 0; i < n; i++) {
434  coordinates[i][0] = points[i][0];
435  coordinates[i][1] = points[i][1];
436  info[i] = statusInfo[i];
437  };
438  };
439 private:
440  double coordinates[n][2];
441  StatusInfo info[n];
442 };
443 
444 //------------------------------------------------------------------------------
445 
453 class JsonPoint : public cv::Point_<json_number>
454 {
455 public:
456  JsonPoint(const json_string& key) : key_(key) {};
457  bool tryReadFromJson(const JSONNode& node)
458  {
459  if (node.name() == key_) {
460  x = node["x"].as_float();
461  y = node["y"].as_float();
462  return true;
463  };
464  return false;
465  };
466  void writeToJson(JSONNode& parent)
467  {
468  JSONNode& node = getEmptyJsonNode(parent, key_);
469 
470  JSONNode c(JSON_NUMBER);
471  c.set_name("x");
472  c = x;
473  node.push_back(c);
474 
475  c.set_name("y");
476  c = y;
477  node.push_back(c);
478  };
479 private:
480  json_string key_;
481 };
482 
483 //------------------------------------------------------------------------------
484 
492 template <typename T> class JsonValue
493 {
494 public:
495  JsonValue(json_string key, T value) : key_(key), value_(value) {};
496  bool tryReadFromJson(const JSONNode& node)
497  {
498  if (node.name() == key_) {
499  setValue(node);
500  return true;
501  }
502  return false;
503  };
504  void writeToVrCore(void (*setter)(const T value))
505  {
506  setter(value_);
507  };
508  void readFromVrCore(T (*getter)()) { value_ = getter(); };
509  void writeToJson(JSONNode& parent)
510  {
511  JSONNode& value = getEmptyJsonNode(parent, key_);
512  value = value_;
513  };
514  inline void setValue(const JSONNode& node);
515  void setValue(T value, StatusInfo status = guessed)
516  {
517  value_ = value;
518  };
519  T getValue() const { return value_; };
520 private:
521  json_string key_;
522  T value_;
523 };
524 
525 //------------------------------------------------------------------------------
526 
534 template <typename T> class ValueWithStatus
535 {
536 public:
537  ValueWithStatus(json_string key, T value) : key_(key), value_(value), status_(invalid) {};
538  bool tryReadFromJson(const JSONNode& node)
539  {
540  if (node.name() == key_) {
541  readStatusFromJson(node[0], status_);
542  setValue(node[1]);
543  return true;
544  }
545  return false;
546  };
547  void writeToVrCore(void (*setter)(const T value, const StatusInfo& statusInfo))
548  {
549  if (status_ != invalid)
550  setter(value_, status_);
551  };
552  void readFromVrCore(T (*getter)(StatusInfo& info)) { value_ = getter(status_); };
553  void writeToJson(JSONNode& parent)
554  {
555  if (status_ == invalid)
556  status_ = guessed;
557  JSONNode& node = getEmptyJsonArray(parent, key_);
558 
559  JSONNode s(JSON_STRING);
560  writeStatusToJson(s, status_);
561  node.push_back(s);
562 
563  JSONNode value(JSON_BOOL);
564  value = value_;
565  node.push_back(value);
566  };
567  inline void setValue(const JSONNode& node);
568  void setValue(T value, StatusInfo status = guessed)
569  {
570  value_ = value;
571  status_ = status;
572  };
573  T getValue() const { return value_; };
574 private:
575  json_string key_;
576  T value_;
577  StatusInfo status_;
578 };
579 
583 
584 //------------------------------------------------------------------------------
585 
594  friend class CoreViewer;
595 public:
596  JsonTranslator();
597  ~JsonTranslator();
598 
599  bool readFromJson(JSONNode& rootNode);
600  void writeToJson(JSONNode& rootNode);
601  void writeToVrCore();
602  void readFromVrCore();
603 
604  class ImageData
605  {
606  public:
607  ImageData();
608  ~ImageData();
609 
610  const std::string& getFileName() const;
611  void setFileName(const std::string& fileName);
612  StatusInfo getStatusInfo() const;
613  void setStatusInfo(const StatusInfo statusInfo);
614 
615  virtual bool readFromJson(const JSONNode& node);
616  virtual bool writeToJson(JSONNode& node);
617  virtual void writeToVrCore(void (*setCameraAttitude)(const double [3]),
618  void (*setOpticalAxis)(const double [2]),
619  void (*setPercentageMarkMargins)(const int [4]));
620  virtual void writeToVrCore(void (*setCameraAttitude)(const double [3]),
621  void (*setOpticalAxis)(const double [2]),
622  void (*setPercentageMarkMargins)(const int [4], const LateralSide));
623  virtual void readFurther(const JSONNode& node) = 0;
624  protected:
625  class ResultImage {
626  friend class CoreViewer;
627  public:
628  ResultImage();
629  void readJson(const JSONNode& node);
630  void writeJson(JSONNode& node);
631  void readFromVrCore(StatusInfo (*getStatusInfo)());
632  void writeToVrCore(void (*setter) (const char*, const StatusInfo));
633  void writeToVrCore(void (*setter) (const char*, const StatusInfo, const LateralSide));
634  std::string fileName_;
635  StatusInfo statusInfo_;
636  } resultImage;
637 
639  public:
640  Transformation();
641  void readJson(const JSONNode& node);
642  void writeJson(JSONNode& node);
643  void readFromVrCore(void (*getter)(int [2], int [2], double [2], double&));
644  void readFromVrCore(void (*getter)(int [2], int [2], double [2], double&, const LateralSide));
645  void writeToVrCore(void (*setter)(const int [2], const int [2], const double [2], const double));
646  void writeToVrCore(void (*setter)(const int [2], const int [2], const double [2], const double, const LateralSide));
647  private:
648  int imageSize_ [2];
649  int clippingOffset_ [2];
650  double pivot_ [2];
651  double angle_;
652  bool isValid() const;
653  } transformation;
654  private:
656  double par_;
657  std::string fileName_;
658  double opticalAxis_ [2];
659  double cameraUp_ [3];
660  IntArray<WINDROSE_DIRECTION_COUNT> markMarginsInPercent_;
661  StatusInfo statusInfo_;
662  SubStatus subStatus_;
663  bool readCameraAttitudeFromJson(const JSONNode& node);
664  };
665 
666  class FrontImageData : public ImageData
667  {
668  friend class CoreViewer;
669  public:
670  FrontImageData();
671  bool readFromJson(const JSONNode& node);
672  void readFurther(const JSONNode& node);
673  bool writeToJson(JSONNode& node);
674  void writeMetsArrayToJson(JSONNode& node) const;
675  void writeToVrCore();
676  void readFromVrCore();
677  const IntValue& lensDiameter(LensType lensType, LateralSide side) const { return (side == _R) ? lensDiameter_[lensType][_R] : lensDiameter_[lensType][_L]; };
678  private:
679  class LensBox {
680  public:
683  };
684  private:
685  class ProgressiveCorridor {
686  public:
688  CoordinateSet<EYE_COUNT> Bottoms [GROOVE_DEPTH_CLASS];
689  };
690 
692  CoordinateSet<EYE_COUNT> irides_;
693  CoordinateSet<EYE_COUNT> faceFormAngleRefs_;
694  LensBox lensBox_[LATERAL_SIDE];
695  //lensBox lensBoxL_;
696  CoordinateSet<EYE_COUNT> lensCenter_[LENS_TYPE];
697  ValueWithStatus<int> lensDiameter_[LENS_TYPE][LATERAL_SIDE];
698  DoubleArray<2> lensPlanePixelsPerMm_[LATERAL_SIDE];
699  IntArrayWithStatus<4> hoyaMETS_;
700  ProgressiveCorridor progressiveCorridor_;
701  CoordinateSet<STRUT_LENSCONTOUR_INTERSECTION_COUNT> strutLensContourIntersections_;
702  BoolValue infantGlassesConfig_;
703 
704  void readProgressiveCorridorBottoms(const JSONNode& node);
705  void readLensData(const JSONNode& node, const LensType lensType);
706  void writeLensData(JSONNode& node, const LensType lensType);
707  };
708 
718  {
719  public:
720  VarioInsetImageData(VarioInsetPos varioInsetPos, size_t index);
721  void readFurther(const JSONNode& node);
722  bool writeToJson(JSONNode& node);
723  void writeToVrCore();
724  void readFromVrCore();
725 
726  private:
728  CoordinateSet<EYE_COUNT> irides_;
729  float readingDistance_;
730  VarioInsetPos varioInsetPos_;
731  size_t index_;
732  };
733 
735  std::vector<VarioInsetImageData> top_;
736  std::vector<VarioInsetImageData> middle_;
737  std::vector<VarioInsetImageData> bottom_;
738  public:
740  void readImages(const JSONNode& node, std::vector<VarioInsetImageData>& images, VarioInsetPos p);
741  void writeImages(JSONNode& node, std::vector<VarioInsetImageData>& images);
742  bool readFromJson(const JSONNode& node);
743  void writeToJson(JSONNode& node);
744  void writeToVrCore();
745  void readFromVrCore();
746  };
747 
748  class SideImageData : public ImageData
749  {
750  friend class CoreViewer;
751  private:
752  LateralSide side_;
755  public:
756  SideImageData(LateralSide side) : ImageData() { side_ = side; };
757  void readFurther(const JSONNode& node);
758  bool writeToJson(JSONNode& node);
759  // Redundanz, ich hass dich ganz
760  void readFromVrCoreR();
761  void readFromVrCoreL();
762  void writeToVrCoreR();
763  void writeToVrCoreL();
764 
765  };
766 
767  void display();
768 
769 private:
770  MeasuringMethod method_;
771  ExposureArrangement exposureArrangement_;
772  double correction_;
773 
774  FrontImageData front_;
775  SideImageData right_;
776  SideImageData left_;
777  DoubleArray<2> grooveDepth_;
778  double lensThickness_;
779 
780  VarioInsetImages nearFront_;
781  int computationModel_;
782  bool hasNearFront_;
783 
784  void readRightSideFromVrCore();
785  void readLeftSideFromVrCore();
786  void writeRightSideToVrCore();
787  void writeLeftSideToVrCore();
788  bool methodNeeds(JsonTranslator::ImageData& image) const;
789 
790  void createGrooveDepthBranch(JSONNode& parent, GrooveDepthClass grooveDepthClass, const bool rounded);
791  void createGrooveDepthBranches(JSONNode& parent, const bool rounded);
792  void createResultList(JSONNode& node, const Results& results, const bool rounded) const;
793 };
794 
795 } // namespace vr
796 #endif // JSONTRANSLATOR_H
Definition: JsonTranslator.h:534
Definition: JsonTranslator.h:453
Definition: JsonTranslator.h:492
Definition: JsonTranslator.h:734
Definition: JsonTranslator.h:190
Definition: JsonTranslator.h:638
Definition: JsonTranslator.h:625
vario Inset-Aufnahme
Definition: JsonTranslator.h:717
Definition: JsonTranslator.h:604
Definition: types.h:26
Definition: JsonTranslator.h:337
"Übersetzt" zwischen JSON und vrcore
Definition: JsonTranslator.h:593
Definition: core_viewer.h:13
Definition: JsonTranslator.h:274
Definition: JsonTranslator.h:134
Definition: JsonTranslator.h:666
Definition: JsonTranslator.h:748