// ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- // Copyright (c) 2018-2023 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once #include #include #include #include #include #include "open3d/visualization/gui/SceneWidget.h" namespace open3d { namespace geometry { class Geometry3D; } // namespace geometry namespace t { namespace geometry { class Geometry; } // namespace geometry } // namespace t namespace visualization { namespace visualizer { /// Internal class that acts as a selections model + controller for /// O3DVisualizer class O3DVisualizerSelections { public: struct SelectedIndex { size_t index; /// the index of the point within the object size_t order; /// A monotonically increasing number indicating the /// relative order of when the index was selected Eigen::Vector3d point; /// the point in R^3 (for convenience) bool operator!=(const SelectedIndex& rhs) const { return index != rhs.index; } bool operator<(const SelectedIndex& rhs) const { return index < rhs.index; } }; using SelectionSet = std::map>; public: O3DVisualizerSelections(gui::SceneWidget& widget3d); ~O3DVisualizerSelections(); void NewSet(); void RemoveSet(int index); void SelectSet(int index); size_t GetNumberOfSets() const; void SelectIndices( const std::map>>& indices); void UnselectIndices( const std::map>>& indices); std::vector GetSets(); // Since the points are spheres, the radius is in world coordinates void SetPointSize(double radius_world); void MakeActive(); void MakeInactive(); bool IsActive() const; void SetSelectableGeometry( const std::vector& geometry); private: void UpdatePointSize(); void UpdateSelectionGeometry(); private: gui::SceneWidget& widget3d_; int next_id_ = 1; struct SelectedPoints { std::string name; SelectionSet indices; }; double point_size_ = 3.0; bool is_active_ = false; size_t pick_order_ = 0; std::vector sets_; int current_set_index_ = -1; bool point_size_changed_ = false; }; } // namespace visualizer } // namespace visualization } // namespace open3d