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 "spdmon.hpp"
7
8#include <pcl/visualization/pcl_visualizer.h>
9#include <reusex/core/processing_observer.hpp>
10#include <reusex/core/visual_observer.hpp>
11#include <reusex/reconstruction/CellComplex.hpp>
12#include <reusex/types.hpp>
13
14#include <latch>
15#include <mutex>
16#include <queue>
17
18namespace rux {
19
22 public:
23 using ViewerPtr = std::shared_ptr<pcl::visualization::PCLVisualizer>;
24 using VizTask =
25 std::function<void(const ViewerPtr &, const std::vector<int> &viewports)>;
26 using Pair = std::pair<Eigen::Vector4d, Eigen::Vector3d>;
27 using PlanePair = std::pair<Pair, Pair>;
28
30
31 // Viewer callbacks
32
33 // Default implementation does nothing - users can override this method to add
34 template <typename T>
35 void viewer_add_geometry(std::string_view
36 /*name*/,
37 const T & /*geometry*/, std::string_view /*stage*/,
38 int /*idx*/) {};
39
40 // Override virtual method for planes
41 void viewer_add_plane(std::string_view name, const Eigen::Vector4d &plane,
42 reusex::core::Stage stage, int idx) override;
43 void viewer_add_plane(std::string_view name, const Pair &plane,
44 reusex::core::Stage stage, int idx) override;
45 void viewer_add_plane_pair(std::string_view name, const PlanePair &pair,
46 reusex::core::Stage stage, int idx) override;
48 std::string_view name,
49 const std::shared_ptr<reusex::geometry::CellComplex> &cc,
50 reusex::core::Stage stage, int idx) override;
51
52 void viewer_add_cloud(std::string_view name,
53 const reusex::CloudConstPtr &cloud,
54 reusex::core::Stage stage, int idx) override;
55
56 void viewer_add_camera_frustum(std::string_view name, double focal_x,
57 double focal_y, int image_width,
58 int image_height, const Eigen::Affine3f &pose,
59 reusex::core::Stage stage, int idx) override;
60
62 std::string_view name, const reusex::CloudLocPtr &disc_points,
63 const std::shared_ptr<std::vector<pcl::Vertices>> &disc_outlines,
64 const pcl::CorrespondencesPtr &edges, reusex::core::Stage stage,
65 int idx) override;
66
67 void viewer_add_labeled_cloud(std::string_view name,
68 const reusex::CloudConstPtr &cloud,
69 const reusex::CloudLConstPtr &labels,
70 reusex::core::Stage stage, int idx) override;
71
72 // Progress bar callbacks
73 void on_process_started(reusex::core::Stage stage, size_t total) override;
75 void on_process_updated(reusex::core::Stage stage, size_t increment) override;
76
77 // Viewer control methods
80 bool viewer_is_active() const;
83 void viewer_request_viewports(size_t num_viewports);
84
85 private:
86 void viewer_drain_tasks(const ViewerPtr &viewer);
87 void viewer_loop(std::latch &initialized);
88
89 std::vector<int> viewports_ = std::vector<int>(1);
90 std::thread viz_thread_;
91 std::queue<VizTask> task_queue_;
92 std::mutex queue_mutex_;
93 std::atomic_bool stop_requested_{false};
94 std::atomic_bool running_{false};
95 std::unique_ptr<spdmon::LoggerProgress> progress_logger_;
96};
97
101
102// Return non-owning reference to the global processing observer instance
104} // namespace rux
std::pair< Eigen::Vector4d, Eigen::Vector3d > Pair
void on_process_finished(reusex::core::Stage stage) override
void viewer_add_plane(std::string_view name, const Pair &plane, reusex::core::Stage stage, int idx) override
void on_process_updated(reusex::core::Stage stage, size_t increment) override
void viewer_add_plane_pair(std::string_view name, const PlanePair &pair, reusex::core::Stage stage, int idx) override
void on_process_started(reusex::core::Stage stage, size_t total) override
std::function< void(const ViewerPtr &, const std::vector< int > &viewports)> VizTask
std::pair< Pair, Pair > PlanePair
void viewer_add_geometry(std::string_view, const T &, std::string_view, int)
void viewer_add_labeled_cloud(std::string_view name, const reusex::CloudConstPtr &cloud, const reusex::CloudLConstPtr &labels, reusex::core::Stage stage, int idx) override
void viewer_add_cell_complex(std::string_view name, const std::shared_ptr< reusex::geometry::CellComplex > &cc, reusex::core::Stage stage, int idx) override
void viewer_enqueue_task(VizTask task)
void viewer_add_plane(std::string_view name, const Eigen::Vector4d &plane, reusex::core::Stage stage, int idx) override
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, reusex::core::Stage stage, int idx) override
void viewer_add_visibility_graph(std::string_view name, const reusex::CloudLocPtr &disc_points, const std::shared_ptr< std::vector< pcl::Vertices > > &disc_outlines, const pcl::CorrespondencesPtr &edges, reusex::core::Stage stage, int idx) override
void viewer_add_cloud(std::string_view name, const reusex::CloudConstPtr &cloud, reusex::core::Stage stage, int idx) override
std::shared_ptr< pcl::visualization::PCLVisualizer > ViewerPtr
void viewer_request_viewports(size_t num_viewports)
typename CloudL::ConstPtr CloudLConstPtr
typename Cloud::ConstPtr CloudConstPtr
typename CloudLoc::Ptr CloudLocPtr
void setup_processing_observer()
VizualizationObserver & get_processing_observer()
void wait_for_viewer()
void start_viewer()