OpenLexocad  27.0
Variant.h
Go to the documentation of this file.
1 #pragma once
2 #pragma warning(disable : 4531)
3 
4 #if _MSC_VER >= 1600
5 #define BOOST_HAS_STDINT_H
6 #include <stdint.h>
7 #if !defined(HAVE_INT8_T)
8 #define HAVE_INT8_T // Coin Problem
9 #endif
10 #endif
11 
12 
13 #include <Core/core_defines2.h>
14 
15 #pragma warning(disable : 4251)
16 #pragma warning(push)
17 #pragma warning(disable : 4100)
18 #pragma warning(disable : 4005)
19 
20 class QDateTime;
21 class QFont;
22 
23 
24 #include <Base/Color.h>
25 #include <Base/GlobalId.h>
26 #include <Base/String.h>
27 #include <Base/md5.h>
28 #include <Draw/Arrowheads.h>
29 #include <Draw/DrawStyle.h>
30 #include <Draw/OglMaterial.h>
31 #include <Draw/Texture2.h>
32 #include <Draw/Texture2Transform.h>
33 #include <Draw/TextureCoordinateFunction.h>
34 #include <Draw/TextureCoordinateMapping.h>
35 #include <Geom/Ax1.h>
36 #include <Geom/Ax2.h>
37 #include <Geom/Ax22d.h>
38 #include <Geom/Ax2d.h>
39 #include <Geom/BrepData.h>
41 #include <Geom/Dir.h>
42 #include <Geom/GTrsf.h>
43 #include <Geom/Pnt.h>
44 #include <Geom/Pnt2d.h>
45 #include <Geom/Trsf.h>
46 #include <Geom/Vec.h>
47 
48 #include <boost/any.hpp>
49 #include <boost/smart_ptr.hpp>
50 #include <boost/unordered_set.hpp>
51 #include <list>
52 #include <map>
53 #include <memory>
54 #include <set>
55 #include <string>
56 #include <vector>
57 
58 
59 
60 #pragma warning(pop)
61 
62 class Variant;
63 class CA_VariantP;
64 
65 namespace LxIfcBase
66 {
67 class LxIfcEntity;
68 }
69 
70 namespace Topo
71 {
72 class Shape;
73 }
74 
75 namespace App
76 {
77 class Placement;
78 }
79 
80 typedef std::shared_ptr<Topo::Shape> pShape;
81 typedef std::shared_ptr<Topo::Shape const> pConstShape;
82 
83 namespace Core
84 {
85 class DocObject;
86 class VariantHandler;
87 struct ImportMessageDataType;
88 struct SearchValue;
89 
91 {
92  explicit Variant(const char* s); // private to forbid creating Variant(const char *), which creates Variant of Bool type without this constructor
93 
94 public:
95  friend class VariantHandler;
96  friend class App::Placement;
97  friend class Topo::Shape;
98 
99  enum Type
100  {
101  Undefined = 0,
164  User = 127
165  };
166 
167  Variant();
168  Variant(const Variant& in);
169  explicit Variant(int i);
170  explicit Variant(long i);
171  explicit Variant(uint8_t i);
172  explicit Variant(uint32_t i);
173  explicit Variant(uint64_t i);
174  explicit Variant(double d);
175  // explicit Variant(const std::string &s);
176  explicit Variant(const wchar_t* s);
177  explicit Variant(const Base::String& s);
178  // explicit Variant(const char *s);
179  explicit Variant(bool b);
180  explicit Variant(const Base::Color& c);
181  explicit Variant(const Base::MColor& c);
182  explicit Variant(const std::vector<Base::Color>& cl);
183  explicit Variant(const std::vector<Base::MColor>& cl);
184  explicit Variant(const Draw::OglMaterial& m);
185  explicit Variant(const Draw::Texture2& t);
186  explicit Variant(const Draw::Texture2Transform& ttf);
187  explicit Variant(const Draw::TextureCoordinateMapping& tcm);
188  explicit Variant(const Draw::TextureCoordinateFunction& tcf);
189  explicit Variant(const Draw::DrawStyle& ds);
190  explicit Variant(const Draw::Arrowheads& ah);
191  explicit Variant(const std::list<std::string>& sl);
192  explicit Variant(const std::list<Base::String>& sl);
193  explicit Variant(const std::map<int, Draw::OglMaterial>& ml);
194  explicit Variant(const std::map<int, Draw::Texture2>& tl);
195  explicit Variant(const Geom::Ax1& ax1);
196  explicit Variant(const Geom::Ax2& ax2);
197  explicit Variant(const Geom::Ax2d& ax2d);
198  explicit Variant(const Geom::Ax22d& ax22d);
199  // Variant(const Core::Placement& pl);
200  explicit Variant(Core::DocObject* o);
201  explicit Variant(const boost::unordered_set<Core::DocObject*>& oset);
202  explicit Variant(const std::vector<Core::DocObject*>& objects);
203  explicit Variant(const Geom::Pnt& p);
204  explicit Variant(const Geom::Pnt2d& p);
205  explicit Variant(const Geom::Vec& v);
206  explicit Variant(const Geom::Dir& dir);
207  explicit Variant(const Geom::Trsf& t);
208  explicit Variant(const Geom::GTrsf& t);
209  explicit Variant(const std::vector<int>& ilist);
210  explicit Variant(const std::vector<uint8_t>& ilist);
211  explicit Variant(const std::list<Geom::Vec>& vlist);
212  explicit Variant(const std::vector<Geom::Pnt>& plist);
213  explicit Variant(const std::vector<Geom::Pnt2d>& plist);
214  explicit Variant(const MD5& v);
215  explicit Variant(pBrepData data);
216  explicit Variant(const std::vector<pBrepData>& dataSet);
217  explicit Variant(pShape shape);
218  explicit Variant(pConstShape shape);
219  explicit Variant(const std::list<double>& value);
220  explicit Variant(const std::list<std::list<Geom::Pnt>>& the_list);
221  explicit Variant(const Geom::CompoundPlaneAngle& compangle);
222  explicit Variant(const std::vector<Core::Variant>& varList);
223  explicit Variant(const Base::GlobalId& id);
224  explicit Variant(const std::shared_ptr<ImportMessageDataType> aData);
225  explicit Variant(const std::shared_ptr<LxIfcBase::LxIfcEntity> aEntity);
226  explicit Variant(const std::list<Core::DocObject*>& list);
227 
228  ~Variant(void);
229 
230  bool operator==(const Variant& other) const;
231  bool operator!=(const Variant& other) const;
232 
233  Variant::Type getType() const;
235  virtual int getUserType() const { return (int)getType(); }
236  bool canConvert(Variant::Type t) const;
237  uint64_t toUInt64(bool* ok = 0) const;
238  uint32_t toUInt32(bool* ok = 0) const;
239  uint8_t toUInt8(bool* ok = 0) const;
240  int toInteger(bool* ok = 0) const;
241  long toLong(bool* ok = 0) const;
242  std::string toStdString(bool* ok = 0) const;
243  Base::String toString(bool* ok = 0) const;
244  double toDouble(bool* ok = 0) const;
245  bool toBool(bool* ok = 0) const;
246  Base::Color toColor(bool* ok = 0) const;
247  std::vector<Base::Color> toColorList(bool* ok = 0) const;
248  Draw::OglMaterial toMaterial(bool* ok = 0) const;
249  Draw::Texture2 toTexture2(bool* ok = 0) const;
250  Draw::Texture2Transform toTexture2Transform(bool* ok = 0) const;
251  Draw::TextureCoordinateMapping toTextureCoordinateMapping(bool* ok = 0) const;
252  Draw::TextureCoordinateFunction toTextureCoordinateFunction(bool* ok = 0) const;
253  Draw::DrawStyle toDrawStyle(bool* ok = 0) const;
254  Draw::Arrowheads toArrowheads(bool* ok = 0) const;
255  std::list<std::string> toStdStringList(bool* ok = 0) const;
256  std::list<Base::String> toStringList(bool* ok = 0) const;
257  std::map<int, Draw::OglMaterial> toMaterialList(bool* ok = 0) const;
258  std::map<int, Draw::Texture2> toTexture2List(bool* ok = 0) const;
259  Geom::Ax1 toAxis1(bool* ok = 0) const;
260  Geom::Ax2 toAxis2(bool* ok = 0) const;
261  Geom::Ax2d toAxis2d(bool* ok = 0) const;
262  Geom::Ax22d toAxis22d(bool* ok = 0) const;
263  // Core::Placement toPlacement(bool* ok = 0) const;
264  Core::DocObject* toObject(bool* ok = 0) const;
265  boost::unordered_set<Core::DocObject*> toObjectSet(bool* ok = 0) const;
266  std::vector<Core::DocObject*> toObjectVector(bool* ok = 0) const;
267  Geom::Pnt toPoint(bool* ok = 0) const;
268  Geom::Pnt2d toPoint2d(bool* ok = 0) const;
269  Geom::Vec toVector(bool* ok = 0) const;
270  Geom::Dir toDirection(bool* ok = 0) const;
271  Geom::Trsf toTransform(bool* ok = 0) const;
272  Geom::GTrsf toGTransform(bool* ok = 0) const;
273  std::list<Geom::Vec> toVectorList(bool* ok = 0) const;
274  std::vector<Geom::Pnt> toPointList(bool* ok = 0) const;
275  std::vector<Geom::Pnt2d> toPoint2dList(bool* ok = 0) const;
276  MD5 toMD5(bool* ok = 0) const;
277  pBrepData toBrepData(bool* ok = 0) const;
278  std::vector<pBrepData> toBrepDataSet(bool* ok = 0) const;
279  std::vector<int> toIntegerList(bool* ok = 0) const;
280  std::vector<uint8_t> toUInt8List(bool* ok = 0) const;
281  // pShape toShape(bool* ok = 0) const;
282  std::list<double> toRealList(bool* ok = 0) const;
283  std::list<std::list<Geom::Pnt>> toListPointList(bool* ok = 0) const;
284  Geom::CompoundPlaneAngle toCompoundPlaneAngle(bool* ok = 0) const;
285  std::vector<Core::Variant> toVariantList(bool* ok = 0) const;
286  const std::shared_ptr<Core::ImportMessageDataType> toImportMessageDataType(bool* ok = 0) const;
287  std::shared_ptr<LxIfcBase::LxIfcEntity> toIfcEntity(bool* ok = 0) const;
288  std::list<Core::DocObject*> toLinkList(bool* ok = nullptr) const;
289 
292  Base::String getAsString(bool humanReadable = true, int* version = 0) const;
294  std::string getTypeAsString() const;
295 
296  bool hasValue() const;
297 
299  int type;
301  boost::any data;
302 
303 #ifndef SWIG
304 
305  explicit Variant(const QFont& font);
306  explicit Variant(const QDateTime& dateTime);
307  explicit Variant(const std::list<QDateTime>& dateTime);
308  explicit Variant(const std::vector<std::vector<SearchValue>>& searchSettings);
309  explicit Variant(const std::vector<std::vector<std::vector<SearchValue>>>& searchSettingsVector);
310 
311  QFont toFont(bool* ok = 0) const;
312  QDateTime toDateTime(bool* ok = 0) const;
313  std::list<QDateTime> toDateTimeList(bool* ok = 0) const;
314  std::vector<std::vector<SearchValue>> toSearchSettings(bool* ok = 0) const;
315  std::vector<std::vector<std::vector<SearchValue>>> toSearchSettingsVector(bool* ok = 0) const;
316 
317  Base::GlobalId toGUID(bool* ok = 0) const;
318 
319  template <typename T>
320  T getValue(bool* ok) const
321  {
322  if (ok)
323  *ok = true;
324  return boost::any_cast<T>(data);
325  }
326  template <>
327  int getValue<int>(bool* ok) const
328  {
329  return toInteger(ok);
330  }
331  template <>
332  uint32_t getValue<uint32_t>(bool* ok) const
333  {
334  return toUInt32(ok);
335  }
336  template <>
337  long getValue<long>(bool* ok) const
338  {
339  return toLong(ok);
340  }
341  template <>
342  std::string getValue<std::string>(bool* ok) const
343  {
344  return toStdString(ok);
345  }
346  template <>
347  double getValue<double>(bool* ok) const
348  {
349  return toDouble(ok);
350  }
351  template <>
352  bool getValue<bool>(bool* ok) const
353  {
354  return toBool(ok);
355  }
356  template <>
357  Base::Color getValue<Base::Color>(bool* ok) const
358  {
359  return toColor(ok);
360  }
361  template <>
362  Draw::OglMaterial getValue<Draw::OglMaterial>(bool* ok) const
363  {
364  return toMaterial(ok);
365  }
366  template <>
367  Draw::Texture2 getValue<Draw::Texture2>(bool* ok) const
368  {
369  return toTexture2(ok);
370  }
371  template <>
372  Draw::Texture2Transform getValue<Draw::Texture2Transform>(bool* ok) const
373  {
374  return toTexture2Transform(ok);
375  }
376  template <>
377  Draw::TextureCoordinateMapping getValue<Draw::TextureCoordinateMapping>(bool* ok) const
378  {
379  return toTextureCoordinateMapping(ok);
380  }
381  template <>
382  Draw::TextureCoordinateFunction getValue<Draw::TextureCoordinateFunction>(bool* ok) const
383  {
384  return toTextureCoordinateFunction(ok);
385  }
386  template <>
387  Draw::DrawStyle getValue<Draw::DrawStyle>(bool* ok) const
388  {
389  return toDrawStyle(ok);
390  }
391  template <>
392  Draw::Arrowheads getValue<Draw::Arrowheads>(bool* ok) const
393  {
394  return toArrowheads(ok);
395  }
396  template <>
397  std::list<std::string> getValue<std::list<std::string>>(bool* ok) const
398  {
399  return toStdStringList(ok);
400  }
401  template <>
402  std::list<Base::String> getValue<std::list<Base::String>>(bool* ok) const
403  {
404  return toStringList(ok);
405  }
406  template <>
407  std::map<int, Draw::OglMaterial> getValue<std::map<int, Draw::OglMaterial>>(bool* ok) const
408  {
409  return toMaterialList(ok);
410  }
411  template <>
412  std::map<int, Draw::Texture2> getValue<std::map<int, Draw::Texture2>>(bool* ok) const
413  {
414  return toTexture2List(ok);
415  }
416  template <>
417  Geom::Ax1 getValue<Geom::Ax1>(bool* ok) const
418  {
419  return toAxis1(ok);
420  }
421  template <>
422  Geom::Ax2 getValue<Geom::Ax2>(bool* ok) const
423  {
424  return toAxis2(ok);
425  }
426  template <>
427  Geom::Ax2d getValue<Geom::Ax2d>(bool* ok) const
428  {
429  return toAxis2d(ok);
430  }
431  template <>
432  Geom::Ax22d getValue<Geom::Ax22d>(bool* ok) const
433  {
434  return toAxis22d(ok);
435  }
436  /*template <>
437  Core::Placement getValue<Core::Placement>(bool* ok) const { return toPlacement(ok); } */
438  template <>
439  Core::DocObject* getValue<Core::DocObject*>(bool* ok) const
440  {
441  return toObject(ok);
442  }
443  template <>
444  boost::unordered_set<Core::DocObject*> getValue<boost::unordered_set<Core::DocObject*>>(bool* ok) const
445  {
446  return toObjectSet(ok);
447  }
448  template <>
449  std::vector<Core::DocObject*> getValue<std::vector<Core::DocObject*>>(bool* ok) const
450  {
451  return toObjectVector(ok);
452  }
453  // template <>
454  // QFont getValue<QFont>(bool* ok) const { return toFont(ok); }
455  // template <>
456  // QDateTime getValue<QDateTime>(bool* ok) const { return toDateTime(ok); }
457  template <>
458  Geom::Pnt getValue<Geom::Pnt>(bool* ok) const
459  {
460  return toPoint(ok);
461  }
462  template <>
463  Geom::Pnt2d getValue<Geom::Pnt2d>(bool* ok) const
464  {
465  return toPoint2d(ok);
466  }
467  template <>
468  Geom::Vec getValue<Geom::Vec>(bool* ok) const
469  {
470  return toVector(ok);
471  }
472  template <>
473  Geom::Dir getValue<Geom::Dir>(bool* ok) const
474  {
475  return toDirection(ok);
476  }
477  template <>
478  Geom::Trsf getValue<Geom::Trsf>(bool* ok) const
479  {
480  return toTransform(ok);
481  }
482  template <>
483  Geom::GTrsf getValue<Geom::GTrsf>(bool* ok) const
484  {
485  return toGTransform(ok);
486  }
487  template <>
488  std::list<Geom::Vec> getValue<std::list<Geom::Vec>>(bool* ok) const
489  {
490  return toVectorList(ok);
491  }
492  template <>
493  std::vector<Geom::Pnt> getValue<std::vector<Geom::Pnt>>(bool* ok) const
494  {
495  return toPointList(ok);
496  }
497  template <>
498  std::vector<Geom::Pnt2d> getValue<std::vector<Geom::Pnt2d>>(bool* ok) const
499  {
500  return toPoint2dList(ok);
501  }
502  template <>
503  MD5 getValue<MD5>(bool* ok) const
504  {
505  return toMD5(ok);
506  }
507  template <>
508  pBrepData getValue<pBrepData>(bool* ok) const
509  {
510  return toBrepData(ok);
511  }
512  template <>
513  std::vector<pBrepData> getValue<std::vector<pBrepData>>(bool* ok) const
514  {
515  return toBrepDataSet(ok);
516  }
517  template <>
518  std::vector<int> getValue<std::vector<int>>(bool* ok) const
519  {
520  return toIntegerList(ok);
521  }
522  /*template <>
523  pShape getValue<pShape>(bool* ok) const { return toShape(ok); }*/
524  // template <>
525  // std::list<QDateTime> getValue< std::list<QDateTime> >(bool* ok) const { return toDateTimeList(ok); }
526  template <>
527  Base::GlobalId getValue<Base::GlobalId>(bool* ok) const
528  {
529  return toGUID(ok);
530  }
531  template <>
532  std::shared_ptr<LxIfcBase::LxIfcEntity> getValue<std::shared_ptr<LxIfcBase::LxIfcEntity>>(bool* ok) const
533  {
534  return toIfcEntity(ok);
535  }
536  template <>
537  std::list<Core::DocObject*> getValue<std::list<Core::DocObject*>>(bool* ok) const
538  {
539  return toLinkList(ok);
540  }
541 
542 #endif
543 
544  friend CORE_EXPORT std::ostream& operator<<(std::ostream& o, const Core::Variant& variant);
545 };
546 
547 class CORE_EXPORT Core::VariantHandler
548 {
549 public:
551  virtual Core::Variant create() = 0;
553  virtual bool isEqual(const Core::Variant& v1, const Core::Variant& v2, double tolerance = 1E-06) const = 0;
555  virtual int getType() = 0;
557  virtual Base::String getAsString(const Core::Variant& v) const = 0;
559  static Core::VariantHandler* getVariantHandler(int type);
561  static bool registerVariantHandler(int type, Core::VariantHandler* vhnd);
562 
563 private:
564  static std::map<int, Core::VariantHandler*> registry;
565 };
566 
567 
568 
569 } // Namespace Core
Definition: Variant.h:155
Definition: Variant.h:106
Definition: Variant.h:139
#define CORE_EXPORT
Definition: core_defines2.h:10
A compound measure of plane angle in degrees, minutes, seconds, and optionally millionth-seconds of a...
Definition: CompoundPlaneAngle.h:14
Definition: Color.h:47
Definition: Variant.h:145
Definition: Variant.h:148
Defines a non-persistent 3D Cartesian point.
Definition: Pnt.h:42
Definition: Variant.h:104
Definition: Variant.h:115
Definition: Variant.h:132
Definition: Variant.h:118
constexpr bool operator!=(const basic_hashed_string< Char > &lhs, const basic_hashed_string< Char > &rhs) ENTT_NOEXCEPT
Compares two hashed strings.
Definition: entt.hpp:570
Definition: md5.h:71
Definition: Ax2d.h:48
Definition: Variant.h:111
Definition: Variant.h:113
Definition: Variant.h:122
Definition: Shape.h:228
virtual int getUserType() const
Must be overwritten for custom types.
Definition: Variant.h:235
Definition: Variant.h:137
std::shared_ptr< Geom::BrepData > pBrepData
Definition: BrepData.h:34
Definition: Variant.h:162
A Utf-16 (windows) or ucs4 (unix) encoded string class.
Definition: String.h:29
Definition: Variant.h:129
boost::any data
The data.
Definition: Variant.h:301
LX_CORE_EXPORT Version & version
Definition: Variant.h:108
Definition: Variant.h:90
Definition: Variant.h:130
Definition: Variant.h:126
Definition: Variant.h:131
T getValue(bool *ok) const
Definition: Variant.h:320
Definition: Variant.h:134
Definition: Variant.h:156
Type
Definition: Variant.h:99
Definition: Ax2.h:69
Definition: Variant.h:159
Definition: Variant.h:140
Definition: Variant.h:142
Definition: Trsf.h:58
Definition: Dir.h:46
GEOM_EXPORT std::ostream & operator<<(std::ostream &o, const Geom::Vec &vec)
Definition: GlobalId.h:32
Definition: Variant.h:103
Definition: Base.h:19
int type
The variant type.
Definition: Variant.h:299
Definition: Variant.h:116
Definition: Variant.h:105
Definition: Variant.h:157
Definition: Variant.h:147
Definition: Variant.h:70
Definition: Variant.h:153
Definition: Variant.h:141
Definition: Variant.h:107
Definition: Variant.h:146
Definition: Variant.h:133
Definition: Variant.h:143
basic_registry< entity > registry
Alias declaration for the most common use case.
Definition: entt.hpp:3790
Definition: Variant.h:154
Definition: Ax1.h:52
Definition: Variant.h:114
Definition: Variant.h:151
Defines a non-persistent vector in 3D space.
Definition: Vec.h:45
Definition: GTrsf.h:49
Definition: Variant.h:102
Definition: Variant.h:158
Definition: Variant.h:138
Definition: Ax22d.h:50
Definition: Variant.h:120
Definition: Variant.h:128
Definition: Variant.h:119
Definition: Variant.h:121
Definition: Variant.h:163
Definition: Color.h:23
Definition: Variant.h:161
std::shared_ptr< Topo::Shape const > pConstShape
Definition: Variant.h:81
Definition: Variant.h:149
Definition: Variant.h:109
Definition: Variant.h:135
Definition: Variant.h:125
Definition: Variant.h:136
Defines a non-persistent 2D cartesian point.
Definition: Pnt2d.h:33
Definition: Variant.h:160
Definition: Variant.h:144
Definition: Variant.h:117
Definition: Variant.h:110
Definition: Variant.h:127
Definition: Variant.h:150
Definition: Variant.h:112
Definition: DocObject.h:28
std::shared_ptr< Topo::Shape > pShape
Definition: Variant.h:80
Definition: Variant.h:65
Definition: Variant.h:152