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