ReUseX  0.0.5
3D Point Cloud Processing for Building Reuse
Loading...
Searching...
No Matches
processing_observer.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025 Povl Filip Sonne-Frederiksen
2//
3// SPDX-License-Identifier: GPL-3.0-or-later
4
5#pragma once
6#include "reusex/core/logging.hpp"
7#include "reusex/types.hpp"
8
9#include <Eigen/Geometry>
10#include <fmt/format.h>
11#include <string_view>
12#include <type_traits>
13#include <typeinfo>
14
15// Forward declaration to avoid circular dependency
17class CellComplex;
18} // namespace reusex::geometry
19
20namespace reusex::core {
21
28
29class IObserver {};
30
32 public:
33 ProgressObserver(Stage stage, size_t total = 0);
35
36 void update(size_t progress = 1);
37
38 inline void operator++() { update(1); };
39 inline void operator+=(size_t increment) { update(increment); };
40
41 private:
42 Stage stage_;
43 size_t total_ = 0;
44};
45
47
48 public:
49 virtual ~IVisualObserver() = default;
50 using Pair = std::pair<Eigen::Vector4d, Eigen::Vector3d>;
51 using PlanePair = std::pair<Pair, Pair>;
52
53 // Viewer callbacks
54 template <typename T>
55 void viewer_add_geometry(std::string_view name,
56 [[maybe_unused]] const T &geometry, Stage stage,
57 int idx = 0) {
58 // Special case: if T is Eigen::Vector4d, use virtual dispatch
59 if constexpr (std::is_same_v<T, Eigen::Vector4d>) {
60 viewer_add_plane(name, geometry, stage, idx);
61 } else if constexpr (std::is_same_v<
62 T, std::pair<Eigen::Vector4d, Eigen::Vector3d>>) {
63 viewer_add_plane(name, geometry, stage, idx);
64 } else if constexpr (std::is_same_v<T, PlanePair>) {
65 viewer_add_plane_pair(name, geometry, stage, idx);
66 } else if constexpr (std::is_same_v<
67 T, std::shared_ptr<geometry::CellComplex>>) {
68 viewer_add_cell_complex(name, geometry, stage, idx);
69 } else if constexpr (std::is_same_v<T, CloudConstPtr>) {
70 viewer_add_cloud(name, geometry, stage, idx);
71 } else {
72 // Default implementation: log that geometry type is not handled
73 // This prevents linker errors while providing runtime visibility
74 core::debug("viewer_add_geometry<{}> called for '{}' at stage '{}' "
75 "(no handler registered)",
76 typeid(T).name(), name, to_string(stage));
77 }
78 }
79
80 template <typename T>
81 void viewer_add_geometries(std::string_view name, const T &geometries,
82 Stage stage) {
83 for (size_t i = 0; i < geometries.size(); ++i) {
84 viewer_add_geometry(fmt::format("{}_{}", name, i), geometries[i], stage,
85 i);
86 }
87 }
88
89 // Virtual method for specific geometry types (can be overridden)
90 virtual void viewer_add_plane(std::string_view name,
91 [[maybe_unused]] const Eigen::Vector4d &plane,
92 Stage stage, int /*idx*/ = 0) {
93 // Default: log that geometry type is not handled
94 core::debug("viewer_add_plane called for '{}' at stage '{}' "
95 "(no handler registered)",
96 name, to_string(stage));
97 }
98
99 virtual void viewer_add_plane(
100 std::string_view name,
101 [[maybe_unused]] const std::pair<Eigen::Vector4d, Eigen::Vector3d> &plane,
102 Stage stage, int /*idx*/ = 0) {
103 // Default: log that geometry type is not handled
104 core::debug("viewer_add_plane (with origin) called for '{}' at stage '{}' "
105 "(no handler registered)",
106 name, to_string(stage));
107 }
108
109 virtual void viewer_add_plane_pair(std::string_view name,
110 [[maybe_unused]] const PlanePair &pair,
111 Stage stage, int /*idx*/ = 0) {
112 // Default: log that geometry type is not handled
113 core::debug("viewer_add_plane_pair called for '{}' at stage '{}' "
114 "(no handler registered)",
115 name, to_string(stage));
116 }
117
119 std::string_view name,
120 [[maybe_unused]] const std::shared_ptr<reusex::geometry::CellComplex> &cc,
121 Stage stage, int /*idx*/ = 0) {
122 // Default: log that geometry type is not handled
123 core::debug("viewer_add_cell_complex called for '{}' at stage '{}' "
124 "(no handler registered)",
125 name, to_string(stage));
126 }
127
128 virtual void viewer_add_cloud(std::string_view name,
129 [[maybe_unused]] const CloudConstPtr &cloud,
130 Stage stage, int /*idx*/ = 0) {
131 // Default: log that geometry type is not handled
132 core::debug("viewer_add_cloud called for '{}' at stage '{}' "
133 "(no handler registered)",
134 name, to_string(stage));
135 }
136
138 std::string_view name, [[maybe_unused]] double focal_x,
139 [[maybe_unused]] double focal_y, [[maybe_unused]] int image_width,
140 [[maybe_unused]] int image_height,
141 [[maybe_unused]] const Eigen::Affine3f &pose, Stage stage,
142 int /*idx*/ = 0) {
143 // Default: log that geometry type is not handled
144 core::debug("viewer_add_camera_frustum called for '{}' at stage '{}' "
145 "(no handler registered)",
146 name, to_string(stage));
147 }
148};
150 public:
151 virtual ~IProgressObserver() = default;
152
153 // Progress bar callbacks
154 virtual void on_process_started(Stage, size_t) {}
155 virtual void on_process_finished(Stage) {}
156 virtual void on_process_updated(Stage, size_t) {}
157};
158
159// class NullProcessingObserver final : public IProcessingObserver {};
160
161// Register a global processing observer. The caller retains ownership and must
162// keep the observer alive until reset or replacement. Passing nullptr clears
163// it.
164
167
170
173
174} // namespace reusex::core
virtual void on_process_started(Stage, size_t)
virtual void on_process_updated(Stage, size_t)
virtual ~IProgressObserver()=default
virtual void viewer_add_plane(std::string_view name, const std::pair< Eigen::Vector4d, Eigen::Vector3d > &plane, Stage stage, int=0)
virtual ~IVisualObserver()=default
virtual void viewer_add_cloud(std::string_view name, const CloudConstPtr &cloud, Stage stage, int=0)
std::pair< Eigen::Vector4d, Eigen::Vector3d > Pair
virtual void viewer_add_plane_pair(std::string_view name, const PlanePair &pair, Stage stage, int=0)
virtual void viewer_add_camera_frustum(std::string_view name, double focal_x, double focal_y, int image_width, int image_height, const Eigen::Affine3f &pose, Stage stage, int=0)
virtual void viewer_add_cell_complex(std::string_view name, const std::shared_ptr< reusex::geometry::CellComplex > &cc, Stage stage, int=0)
std::pair< Pair, Pair > PlanePair
void viewer_add_geometry(std::string_view name, const T &geometry, Stage stage, int idx=0)
virtual void viewer_add_plane(std::string_view name, const Eigen::Vector4d &plane, Stage stage, int=0)
void viewer_add_geometries(std::string_view name, const T &geometries, Stage stage)
ProgressObserver(Stage stage, size_t total=0)
void update(size_t progress=1)
void reset_visual_observer()
auto to_string(Material value) -> std::string_view
Convert Material enum to its string identifier.
void set_visual_observer(IVisualObserver *observer)
auto get_visual_observer() -> IVisualObserver *
void reset_progress_observer()
auto get_progress_observer() -> IProgressObserver *
void set_progress_observer(IProgressObserver *observer)
typename Cloud::ConstPtr CloudConstPtr
Definition types.hpp:28