ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
PickPointsInteractor.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 #include <queue>
11 
14 
15 namespace cloudViewer {
16 
17 namespace geometry {
18 class Image;
19 } // namespace geometry
20 
21 namespace visualization {
22 
23 namespace rendering {
24 class Camera;
25 struct MaterialRecord;
26 class MatrixInteractorLogic;
27 class CloudViewerScene;
28 } // namespace rendering
29 
30 namespace gui {
31 
32 class SelectionIndexLookup;
33 
34 // This is an internal class used by SceneWidget
36 public:
38  rendering::Camera* camera);
39  virtual ~PickPointsInteractor();
40 
41  void SetPointSize(int px);
42 
46  const std::vector<SceneWidget::PickableGeometry>& geometry);
47 
50  void SetNeedsRedraw();
51 
54  void SetOnPointsPicked(
55  std::function<void(
56  const std::map<
57  std::string,
58  std::vector<std::pair<size_t, Eigen::Vector3d>>>&,
59  int)> f);
60 
64  void SetOnUIChanged(
65  std::function<void(const std::vector<Eigen::Vector2i>&)>);
66 
68  void SetOnStartedPolygonPicking(std::function<void()> on_poly_pick);
69 
70  void DoPick();
71  void ClearPick();
72 
74  void Mouse(const MouseEvent& e) override;
75  void Key(const KeyEvent& e) override;
76 
77 protected:
78  void OnPickImageDone(std::shared_ptr<geometry::Image> img);
79 
81 
82 private:
84  rendering::Camera* camera_;
85 
86  std::function<void(
87  const std::map<std::string,
88  std::vector<std::pair<size_t, Eigen::Vector3d>>>&,
89  int)>
90  on_picked_;
91  std::function<void(const std::vector<Eigen::Vector2i>&)> on_ui_changed_;
92  std::function<void()> on_started_poly_pick_;
93  int point_size_ = 3;
95  std::shared_ptr<rendering::CloudViewerScene> picking_scene_;
96  std::vector<Eigen::Vector3d> points_;
97  // This is a pointer rather than unique_ptr so that we don't have
98  // to define this (internal) class in the header file.
99  SelectionIndexLookup* lookup_ = nullptr;
100  std::shared_ptr<geometry::Image> pick_image_;
101  bool dirty_ = true;
102  struct PickInfo {
103  std::vector<gui::Point> polygon; // or point, if only one item
104  int keymods;
105  };
106  std::queue<PickInfo> pending_;
107 };
108 
109 } // namespace gui
110 } // namespace visualization
111 } // namespace cloudViewer
boost::geometry::model::polygon< point_xy > polygon
Definition: TreeIso.cpp:37
void SetOnUIChanged(std::function< void(const std::vector< Eigen::Vector2i > &)>)
void SetOnStartedPolygonPicking(std::function< void()> on_poly_pick)
Calls the provided function when polygon picking is initiated.
void SetPickableGeometry(const std::vector< SceneWidget::PickableGeometry > &geometry)
rendering::MatrixInteractorLogic & GetMatrixInteractor() override
PickPointsInteractor(rendering::CloudViewerScene *scene, rendering::Camera *camera)
void OnPickImageDone(std::shared_ptr< geometry::Image > img)
void SetOnPointsPicked(std::function< void(const std::map< std::string, std::vector< std::pair< size_t, Eigen::Vector3d >>> &, int)> f)
Generic file read and write utility for python interface.