RDB 2
queryInvert.hpp
Go to the documentation of this file.
1 /*
2  *******************************************************************************
3  *
4  * Copyright 2023 RIEGL Laser Measurement Systems
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  *
20  *******************************************************************************
21  */
22 /*!
23  *******************************************************************************
24  *
25  * \file queryInvert.hpp
26  * \author RIEGL LMS GmbH, Austria
27  * \brief Point invert query
28  * \version 2016-11-14/AW: Initial version
29  * \version 2017-11-24/AW: Constructors declared as "explicit" (#2825)
30  *
31  *******************************************************************************
32  */
33 
34 #ifndef RIEGL_RDB_POINTCLOUD_QUERYINVERT_HPP
35 #define RIEGL_RDB_POINTCLOUD_QUERYINVERT_HPP
36 
37 //---< INCLUDES >---------------------------------------------------------------
38 
39 #include <memory>
40 #include <string>
41 #include <vector>
42 #include <cstdlib>
43 #include <cstdint>
44 
47 
48 //---< NAMESPACE >--------------------------------------------------------------
49 
50 namespace riegl {
51 namespace rdb {
52 namespace pointcloud {
53 
54 //---< CLASS QueryInvert >------------------------------------------------------
55 /*!
56  * \brief Point invert query
57  *
58  * This class can be used to invert point attributes for all points or just
59  * those that meet some filter criteria. Calculating the inverted value (v')
60  * from the original value (v) and the attribute limits (min and max) is done
61  * as follows:
62  *
63  * v' = max - (v - min)
64  *
65  * For dynamic point attributes (bits/flags) this simply means to flip the
66  * bit (e.g. set "riegl.selected" to 1 if it was 0, otherwise set it to 0).
67  *
68  * This query is similar to using select() and update() and manually inverting
69  * the point attributes except that it might be faster (less processing time)
70  * and easier to use.
71  *
72  * \see riegl::rdb::Pointcloud::invert()
73  *
74  * \note You either must delete the query object or call close()
75  * __before__ the parent Pointcloud instance is closed/deleted!
76  */
78 {
79 public:
80  /*!
81  * \brief Default constructor
82  *
83  * Creates a null query - i.e. the query cannot be used to modify points.
84  *
85  * \see riegl::rdb::Pointcloud::invert()
86  */
87  explicit QueryInvert();
88 
89  /*!
90  * \brief Constructor
91  *
92  * Creates a query prepared for modifying points.
93  *
94  * \note You cannot create new QueryInvert objects this way,
95  * use riegl::rdb::Pointcloud::invert() instead.
96  */
97  explicit QueryInvert(
98  riegl::rdb::PointcloudData *pointcloud,
99  const std::vector<GraphNode::ID> *nodes,
100  const std::string &filter
101  );
102 
103  /*!
104  * \brief Check if query is not null
105  *
106  * \see valid()
107  */
108  operator bool() const;
109 
110  /*!
111  * \brief Check if query is not null
112  *
113  * A null query cannot be used to read points.
114  */
115  bool valid() const;
116 
117  /*!
118  * \brief Finish query
119  *
120  * Call this function when done with modifying points.
121  */
122  void close();
123 
124  /*!
125  * \brief Define attribute
126  *
127  * Use this function to define the point attribute to be inverted. To
128  * define multiple attributes, simply call this function once for each.
129  *
130  * \note Point attributes having a length greater than 1 (vectors like
131  * the true color attribute "riegl.rgba") can only be inverted
132  * as a whole, i.e. you cannot invert particular vector elements
133  * (e.g. using "riegl.rgba[0]" will not work).
134  *
135  * \see riegl::rdb::pointcloud::PointAttributes
136  */
137  void attribute(
138  const std::string &name //!< [in] attribute name
139  );
140 
141  /*!
142  * \brief Invert points
143  *
144  * Use this function to actually invert the point attribute(s).
145  *
146  * To process all points, you need to repeatedly call next() until it
147  * returns 0 (zero, see example 8). The number of points to process in
148  * one step is defined by 'count'. Please note that the actual number
149  * of processed points may be slightly different. To cancel processing
150  * just stop calling next() and cancel (rollback) the transaction.
151  *
152  * \returns the number of points processed
153  */
154  std::uint32_t next(
155  std::uint32_t count //!< [in] number of points to process
156  );
157 
158  /*!
159  * \brief Progress
160  *
161  * This function returns a coarse progress information in percent (0..100%).
162  * Since the total number of modified points is not known in advance, this
163  * value just reflects the progress of the (internal) index traversal.
164  */
165  std::uint32_t progress() const;
166 
167 private:
168  struct Private;
169  std::shared_ptr<Private> data;
170 };
171 
172 }}} // namespace riegl::rdb::pointcloud
173 
174 #endif // RIEGL_RDB_POINTCLOUD_QUERYINVERT_HPP
QueryInvert()
Default constructor.
bool valid() const
Check if query is not null.
Index graph node.
RIEGL Laser Measurement Systems GmbH, Austria.
Definition: context.hpp:48
void attribute(const std::string &name)
Define attribute.
std::uint32_t next(std::uint32_t count)
Invert points.
std::uint32_t progress() const
Progress.
Pointcloud class implementation details.