| RDB 2

rdb-example-08-invert-points.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 #
4 #*******************************************************************************
5 #
6 # Copyright 2025 RIEGL Laser Measurement Systems
7 #
8 # Licensed under the Apache License, Version 2.0 (the "License");
9 # you may not use this file except in compliance with the License.
10 # You may obtain a copy of the License at
11 #
12 # http://www.apache.org/licenses/LICENSE-2.0
13 #
14 # Unless required by applicable law or agreed to in writing, software
15 # distributed under the License is distributed on an "AS IS" BASIS,
16 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 # See the License for the specific language governing permissions and
18 # limitations under the License.
19 #
20 # SPDX-License-Identifier: Apache-2.0
21 #
22 #*******************************************************************************
23 #
24 """
25 rdb-example-08-invert-points.py
26
27 This example shows how to open an existing database and to invert
28 a point attribute by switching the "riegl.selected" and "riegl.visible"
29 bits from 0 to 1 and vice-versa ("bit flip").
30 Please note that this could also be accomplished by combining select and
31 update queries as shown in "rdb-example-4-update-points.cpp", but the
32 invert query might be faster (lower processing time) and easier to use.
33 This example is based on the database of rdb-example-1-create-database.
34 """
35
36 import riegl.rdb
37
38 # Access existing database
39 with riegl.rdb.rdb_open("pointcloud.rdbx") as rdb:
40 # Before we can modify the database, we must start a transaction
41 with riegl.rdb.Transaction(
42 rdb, # point cloud object
43 "Invert", # transaction title
44 "Point Switcher v1.0" # software name
45 ) as transaction:
46
47 def define_attribute(name, title, description, default_value):
48 """Helper function to define a dynamic point attribute"""
49 if not rdb.point_attributes.exists(name):
50 attribute = riegl.rdb.PointAttribute(rdb)
51 attribute.name = name
52 attribute.title = title
53 attribute.description = description
54 attribute.unit_symbol = ""
55 attribute.length = 1
56 attribute.resolution = 1
57 attribute.minimum_value = 0
58 attribute.maximum_value = 1
59 attribute.default_value = default_value
60 attribute.storage_class = riegl.rdb.PointAttribute.StorageClass.DYNAMIC
61 rdb.point_attributes.add(attribute)
62
63 # Make sure that "selected" and "visible" attributes are defined
64 define_attribute("riegl.selected", "Selected", "Point selected", 0.0)
65 define_attribute("riegl.visible", "Visible", "Point visible", 1.0)
66
67 # Flip the "riegl.selected" bits of all points
68 with rdb.invert() as invert:
69 invert.attribute("riegl.selected")
70 while invert.next(10000) > 0:
71 print(f"{invert.progress()}% done")
72
73 # Flip the "riegl.visible" bits of all selected points (i.e.
74 # where the point attribute "riegl.selected" is set to 1).
75 with rdb.invert("riegl.selected == 1") as invert:
76 invert.attribute("riegl.visible")
77 while invert.next(10000) > 0:
78 print(f"{invert.progress()}% done")
79
80 # Finally commit transaction
81 transaction.commit()