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 <pcl/Vertices.h>
10#include <pcl/correspondence.h>
11
12#include <Eigen/Geometry>
13#include <fmt/format.h>
14#include <string_view>
15#include <type_traits>
16#include <typeinfo>
17
18// Forward declaration to avoid circular dependency
20class CellComplex;
21} // namespace reusex::geometry
22
23namespace reusex::core {
24
31
32class IObserver {};
33
35 public:
36 explicit ProgressObserver(Stage stage, size_t total = 0);
38
39 void update(size_t progress = 1);
40
41 inline void operator++() { update(1); };
42 inline void operator+=(size_t increment) { update(increment); };
43
44 private:
45 Stage stage_;
46 size_t total_ = 0;
47};
48
50
51 public:
52 virtual ~IVisualObserver() = default;
53 using Pair = std::pair<Eigen::Vector4d, Eigen::Vector3d>;
54 using PlanePair = std::pair<Pair, Pair>;
55
56 // Viewer callbacks
57 template <typename T>
58 void viewer_add_geometry(std::string_view name,
59 [[maybe_unused]] const T &geometry, Stage stage,
60 int idx = 0) {
61 // Special case: if T is Eigen::Vector4d, use virtual dispatch
62 if constexpr (std::is_same_v<T, Eigen::Vector4d>) {
63 viewer_add_plane(name, geometry, stage, idx);
64 } else if constexpr (std::is_same_v<
65 T, std::pair<Eigen::Vector4d, Eigen::Vector3d>>) {
66 viewer_add_plane(name, geometry, stage, idx);
67 } else if constexpr (std::is_same_v<T, PlanePair>) {
68 viewer_add_plane_pair(name, geometry, stage, idx);
69 } else if constexpr (std::is_same_v<
70 T, std::shared_ptr<geometry::CellComplex>>) {
71 viewer_add_cell_complex(name, geometry, stage, idx);
72 } else if constexpr (std::is_same_v<T, CloudConstPtr>) {
73 viewer_add_cloud(name, geometry, stage, idx);
74 } else {
75 // Default implementation: log that geometry type is not handled
76 // This prevents linker errors while providing runtime visibility
77 core::debug("viewer_add_geometry<{}> called for '{}' at stage '{}' "
78 "(no handler registered)",
79 typeid(T).name(), name, to_string(stage));
80 }
81 }
82
83 template <typename T>
84 void viewer_add_geometries(std::string_view name, const T &geometries,
85 Stage stage) {
86 for (size_t i = 0; i < geometries.size(); ++i) {
87 viewer_add_geometry(fmt::format("{}_{}", name, i), geometries[i], stage,
88 i);
89 }
90 }
91
92 // Virtual method for specific geometry types (can be overridden)
93 virtual void viewer_add_plane(std::string_view name,
94 [[maybe_unused]] const Eigen::Vector4d &plane,
95 Stage stage, int /*idx*/ = 0) {
96 // Default: log that geometry type is not handled
97 core::debug("viewer_add_plane called for '{}' at stage '{}' "
98 "(no handler registered)",
99 name, to_string(stage));
100 }
101
102 virtual void viewer_add_plane(
103 std::string_view name,
104 [[maybe_unused]] const std::pair<Eigen::Vector4d, Eigen::Vector3d> &plane,
105 Stage stage, int /*idx*/ = 0) {
106 // Default: log that geometry type is not handled
107 core::debug("viewer_add_plane (with origin) called for '{}' at stage '{}' "
108 "(no handler registered)",
109 name, to_string(stage));
110 }
111
112 virtual void viewer_add_plane_pair(std::string_view name,
113 [[maybe_unused]] const PlanePair &pair,
114 Stage stage, int /*idx*/ = 0) {
115 // Default: log that geometry type is not handled
116 core::debug("viewer_add_plane_pair called for '{}' at stage '{}' "
117 "(no handler registered)",
118 name, to_string(stage));
119 }
120
122 std::string_view name,
123 [[maybe_unused]] const std::shared_ptr<reusex::geometry::CellComplex> &cc,
124 Stage stage, int /*idx*/ = 0) {
125 // Default: log that geometry type is not handled
126 core::debug("viewer_add_cell_complex called for '{}' at stage '{}' "
127 "(no handler registered)",
128 name, to_string(stage));
129 }
130
131 virtual void viewer_add_cloud(std::string_view name,
132 [[maybe_unused]] const CloudConstPtr &cloud,
133 Stage stage, int /*idx*/ = 0) {
134 // Default: log that geometry type is not handled
135 core::debug("viewer_add_cloud called for '{}' at stage '{}' "
136 "(no handler registered)",
137 name, to_string(stage));
138 }
139
141 std::string_view name, [[maybe_unused]] double focal_x,
142 [[maybe_unused]] double focal_y, [[maybe_unused]] int image_width,
143 [[maybe_unused]] int image_height,
144 [[maybe_unused]] const Eigen::Affine3f &pose, Stage stage,
145 int /*idx*/ = 0) {
146 core::debug("viewer_add_camera_frustum called for '{}' at stage '{}' "
147 "(no handler registered)",
148 name, to_string(stage));
149 }
150
152 std::string_view name, [[maybe_unused]] const CloudLocPtr &disc_points,
153 [[maybe_unused]] const std::shared_ptr<std::vector<pcl::Vertices>>
154 &disc_outlines,
155 [[maybe_unused]] const pcl::CorrespondencesPtr &edges, Stage stage,
156 int /*idx*/ = 0) {
157 core::debug("viewer_add_visibility_graph called for '{}' at stage '{}' "
158 "(no handler registered)",
159 name, to_string(stage));
160 }
161
162 virtual void
163 viewer_add_labeled_cloud(std::string_view name,
164 [[maybe_unused]] const CloudConstPtr &cloud,
165 [[maybe_unused]] const CloudLConstPtr &labels,
166 Stage stage, int /*idx*/ = 0) {
167 core::debug("viewer_add_labeled_cloud called for '{}' at stage '{}' "
168 "(no handler registered)",
169 name, to_string(stage));
170 }
171};
173 public:
174 virtual ~IProgressObserver() = default;
175
176 // Progress bar callbacks
177 virtual void on_process_started(Stage, size_t) {}
178 virtual void on_process_finished(Stage) {}
179 virtual void on_process_updated(Stage, size_t) {}
180};
181
182// class NullProcessingObserver final : public IProcessingObserver {};
183
184// Register a global processing observer. The caller retains ownership and must
185// keep the observer alive until reset or replacement. Passing nullptr clears
186// it.
187
190
193
196
197} // 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)
virtual void viewer_add_visibility_graph(std::string_view name, const CloudLocPtr &disc_points, const std::shared_ptr< std::vector< pcl::Vertices > > &disc_outlines, const pcl::CorrespondencesPtr &edges, Stage stage, int=0)
std::pair< Pair, Pair > PlanePair
virtual void viewer_add_labeled_cloud(std::string_view name, const CloudConstPtr &cloud, const CloudLConstPtr &labels, Stage stage, int=0)
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 CloudL::ConstPtr CloudLConstPtr
Definition types.hpp:36
typename Cloud::ConstPtr CloudConstPtr
Definition types.hpp:28
typename CloudLoc::Ptr CloudLocPtr
Definition types.hpp:39