IQueryDescriptor.hpp
1 #pragma once
2 
3 #include "config.hpp"
4 #include "Handle.hpp"
5 #include "ObjectBase.hpp"
6 #include "IQueryKnn.hpp"
7 #include "IQueryBox.hpp"
8 #include "IQueryCylinder.hpp"
9 #include "IQuerySphere.hpp"
10 #include "IQueryIncremental.hpp"
11 #include "IQueryCombined.hpp"
12 #include "ISamplingStrategy.hpp"
13 #include "IQuerySort.hpp"
14 #include "IParameterSet.hpp"
15 #include "AutoLink.hpp" //enable autolink
16 
17 DM_NAMESPACE_BEGIN
18 
19 class DM_API IQueryDescriptor;
20 typedef Handle< IQueryDescriptor > QueryDescriptorHandle;
21 
22 /// \brief Defines a generic spatial search
23 /// \date 2021-01
24 /// \author wk
25 class DM_API IQueryDescriptor : public ObjectBase
26 {
27 public:
28  //supported parameter set names
29  static constexpr const char *ParamMinPtCount = "minPtCount";
30  static constexpr const char *ParamMaxSearchDistance = "maxSearchDistance";
31 
32  /// creates an empty query descriptor object
33  static IQueryDescriptor* New();
34 
35  /// \brief create a new query descriptor object
36  static IQueryDescriptor* New(QueryBaseHandle query,
38  const QuerySortHandle &sorting = QuerySortHandle(),
39  const ParameterSetHandle &params = ParameterSetHandle());
40 
41  enum struct Vocabulary
42  {
43  minimal,
44  subdivision, // Support subdivision in addition to cellSize. Point-based modules only support cellSize.
45  neighborhood3d = subdivision << 1, // Support 3d- in addition to 2d-neighborhoods. Raster-based modules only support 2d neighborhood definitions.
46  full = (neighborhood3d << 1) - 1,
47  queryOptional = neighborhood3d << 1 // Support descriptors without query.
48  };
49 
50  struct DM_API IDefaults : ObjectBase
51  {
52  static IDefaults* New();
53 
54  virtual IQueryKnn& knn() = 0;
55  virtual IQueryWindow& window() = 0;
56  virtual IQueryCircle& circle() = 0;
57  virtual IQueryCylinder& cylinder() = 0;
58  virtual IQuerySphere& sphere() = 0;
59  virtual IQueryBox& box() = 0;
60  virtual IQueryIncremental& incremental() = 0;
61  virtual IQueryCombined& combined() = 0;
62  virtual ISamplingStrategy& sampling() = 0;
63  virtual IQuerySort& sort() = 0;
64  virtual IQueryDescriptor& queryDescriptor() = 0;
65  };
66 
67  static IQueryDescriptor* New(const char *description, Vocabulary vocabulary = Vocabulary::minimal, const IDefaults *defaults = nullptr);
68  virtual IQueryDescriptor* clone() const = 0;
69  virtual const char *description() const = 0;
70 
71  virtual QueryType queryType() const = 0;
72  virtual bool hasQuery() const = 0;
73  virtual bool hasSampling() const = 0;
74  virtual bool hasSorting() const = 0;
75  virtual bool hasMinPtCount() const = 0;
76  virtual bool hasMaxSearchDistance() const = 0;
77 
78  virtual const IQueryBase &query() const = 0;
79  virtual void query(const IQueryBase &q) = 0;
80  virtual const ISamplingStrategy &sampling() const = 0;
81  virtual void sampling(const ISamplingStrategy &s) = 0;
82  virtual const IQuerySort &sorting() const = 0;
83  virtual void sorting(const IQuerySort &s) = 0;
84 
85  virtual unsigned minPtCount() const = 0;
86  virtual void minPtCount(unsigned) = 0;
87  virtual double maxSearchDistance() const = 0; ///< get the optional maxSearchDistance parameter. DBL_MAX for "max"
88  virtual void maxSearchDistance(double d) = 0; ///< set the optional maxSearchDistance parameter
89 
90  /// \brief query the maximum search 2d distance based on descriptors content (considers the query object and the optional maxSearchDistance parameter)
91  /// \returns double max if no search is unlimited
92  virtual double maxSearchDistance2D() const = 0;
93  /// \brief query the maximum search 3d distance based on descriptors content (considers the query object and the optional maxSearchDistance parameter)
94  /// \returns double max if no search is unlimited
95  virtual double maxSearchDistance3D() const = 0;
96 
97  virtual const char *text() const = 0;
98 };
99 
100 constexpr IQueryDescriptor::Vocabulary operator|(IQueryDescriptor::Vocabulary left, IQueryDescriptor::Vocabulary right)
101 {
102  return IQueryDescriptor::Vocabulary(static_cast<int>(left) | static_cast<int>(right));
103 }
104 
105 DM_NAMESPACE_END
Base class of all geometry objects.
Definition: IQueryWindow.hpp:10
@ window
window type (2D)
@ sphere
sphere (3D)
Base class of all geometry objects.
Definition: IQueryCylinder.hpp:10
Base class of all geometry objects.
Definition: IQuerySphere.hpp:10
QueryType
Definition: IQueryBase.hpp:57
Base class of all geometry objects.
Definition: IQueryBox.hpp:10
Base class of all geometry objects.
Definition: ISamplingStrategy.hpp:13
For defining post spatial query sorting.
Definition: IQuerySort.hpp:13
Defines a generic spatial search.
Definition: IQueryDescriptor.hpp:25
Base class of all query objects.
Definition: IQueryBase.hpp:67
Base class of all query objects.
Definition: IQueryKnn.hpp:22
Base class of all geometry objects.
Definition: IQueryCircle.hpp:10
Incremental spatial query.
Definition: IQueryIncremental.hpp:11
Definition: IQueryDescriptor.hpp:50
combined spatial queries
Definition: IQueryCombined.hpp:12
@ box
box type (3D)
Smart pointer class using reference counting with support for DM objects (see ObjectBase)
Definition: Handle.hpp:75
Definition: M/c++_api/inc/DM/ObjectBase.hpp:8