MeshLib C++ Docs
Loading...
Searching...
No Matches
MRObject.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRAffineXf3.h"
4#include "MRBitSet.h"
5#include "MRBox.h"
6#include "MRExpected.h"
8#include "MRSignal.h"
10
11#include <array>
12#include <filesystem>
13#include <future>
14#include <memory>
15#include <set>
16#include <vector>
17
18namespace Json
19{
20class Value;
21}
22
23namespace MR
24{
25
37{
38public:
41 ObjectChildrenHolder & operator = ( const ObjectChildrenHolder & ) noexcept { return *this; }
45
46 // returns this Object as shared_ptr
47 // finds it among its parent's recognized children
48 [[nodiscard]] MRMESH_API std::shared_ptr<Object> getSharedPtr() const;
49
52 [[nodiscard]] MRMESH_API size_t heapBytes() const;
53
54protected:
56 std::vector< std::shared_ptr< Object > > children_;
57 std::vector< std::weak_ptr< Object > > bastards_;
58};
59
62{
63public:
64 Object() = default;
65 Object( Object && ) noexcept = default;
66 Object & operator = ( Object && ) noexcept = default;
67 virtual ~Object() = default;
68
69 // return name of subtype for serialization purposes
70 constexpr static const char* TypeName() noexcept { return "Object"; }
71 virtual const char* typeName() const { return TypeName(); }
72
74 constexpr static const char* ClassName() noexcept { return "Object"; }
75 virtual std::string className() const { return ClassName(); }
76
78 constexpr static const char* ClassNameInPlural() noexcept { return "Objects"; }
79 virtual std::string classNameInPlural() const { return ClassNameInPlural(); }
80
81 template <typename T>
82 T * asType() { return dynamic_cast<T*>( this ); }
83 template <typename T>
84 const T * asType() const { return dynamic_cast<const T*>( this ); }
85
86 const std::string & name() const { return name_; }
87 virtual void setName( std::string name ) { name_ = std::move( name ); }
88
90 MRMESH_API std::shared_ptr<const Object> find( const std::string_view & name ) const;
91 std::shared_ptr<Object> find( const std::string_view & name ) { return std::const_pointer_cast<Object>( const_cast<const Object*>( this )->find( name ) ); }
92
94 template <typename T>
95 std::shared_ptr<const T> find() const;
96 template <typename T>
97 std::shared_ptr<T> find() { return std::const_pointer_cast<T>( const_cast<const Object*>( this )->find<T>() ); }
98
100 template <typename T>
101 std::shared_ptr<const T> find( const std::string_view & name ) const;
102 template <typename T>
103 std::shared_ptr<T> find( const std::string_view & name ) { return std::const_pointer_cast<T>( const_cast<const Object*>( this )->find<T>( name ) ); }
104
107 const AffineXf3f & xf( ViewportId id = {}, bool * isDef = nullptr ) const { return xf_.get( id, isDef ); }
108 MRMESH_API virtual void setXf( const AffineXf3f& xf, ViewportId id = {} );
110 MRMESH_API virtual void resetXf( ViewportId id = {} );
111
113 const ViewportProperty<AffineXf3f> & xfsForAllViewports() const { return xf_; }
115 virtual void setXfsForAllViewports( ViewportProperty<AffineXf3f> xf ) { xf_ = std::move( xf ); }
116
119 MRMESH_API AffineXf3f worldXf( ViewportId id = {}, bool * isDef = nullptr ) const;
120 MRMESH_API void setWorldXf( const AffineXf3f& xf, ViewportId id = {} );
121
123 MRMESH_API virtual void applyScale( float scaleFactor );
124
128 bool globalVisibility( ViewportMask viewportMask = ViewportMask::any() ) const { return !( globalVisibilityMask() & viewportMask ).empty(); }
131
133 bool isLocked() const { return locked_; }
134 virtual void setLocked( bool on ) { locked_ = on; }
135
138 [[nodiscard]] bool isParentLocked() const { return parentLocked_; }
139 virtual void setParentLocked( bool lock ) { parentLocked_ = lock; }
140
142 const Object * parent() const { return static_cast<const Object *>( parent_ ); }
143 Object * parent() { return static_cast<Object *>( parent_ ); }
144
146 MRMESH_API bool isAncestor( const Object* ancestor ) const;
147
152 [[nodiscard]] const Object* findCommonAncestor( const Object& other ) const
153 {
154 return const_cast<Object &>( *this ).findCommonAncestor( const_cast<Object &>( other ) );
155 }
156
161 const std::vector<std::shared_ptr<Object>>& children() { return children_; }
162
163 #ifdef __GNUC__
164 #pragma GCC diagnostic push
165 #pragma GCC diagnostic ignored "-Wstrict-aliasing" // Fingers crossed.
166 #endif
167 const std::vector<std::shared_ptr<const Object>>& children() const { return reinterpret_cast<const std::vector< std::shared_ptr< const Object > > &>( children_ ); }
168 #ifdef __GNUC__
169 #pragma GCC diagnostic pop
170 #endif
171
176 MRMESH_API virtual bool addChild( std::shared_ptr<Object> child, bool recognizedChild = true );
180 MRMESH_API virtual bool addChildBefore( std::shared_ptr<Object> newChild, const std::shared_ptr<Object> & existingChild );
182 bool removeChild( const std::shared_ptr<Object>& child ) { return removeChild( child.get() ); }
183 MRMESH_API virtual bool removeChild( Object* child );
188
190 MRMESH_API virtual bool select( bool on );
191 virtual bool isSelected() const { return selected_; }
192
195 MRMESH_API virtual void setAncillary( bool ancillary );
196 bool isAncillary() const { return ancillary_; }
199
201 MRMESH_API void setVisible( bool on, ViewportMask viewportMask = ViewportMask::all() );
203 bool isVisible( ViewportMask viewportMask = ViewportMask::any() ) const { return !( visibilityMask() & viewportMask ).empty(); }
205 MRMESH_API virtual void setVisibilityMask( ViewportMask viewportMask );
207 virtual ViewportMask visibilityMask() const { return visibilityMask_; }
208
210 virtual bool getRedrawFlag( ViewportMask ) const { return needRedraw_; }
211 void resetRedrawFlag() const { needRedraw_ = false; }
212
214 MRMESH_API std::shared_ptr<Object> cloneTree() const;
216 MRMESH_API virtual std::shared_ptr<Object> clone() const;
219 MRMESH_API std::shared_ptr<Object> shallowCloneTree() const;
222 MRMESH_API virtual std::shared_ptr<Object> shallowClone() const;
223
225 MRMESH_API virtual std::vector<std::string> getInfoLines() const;
226
231 // This would be automatically skipped in the bindings anyway because of the `Json::Value` parameter.
232 // But skipping it here prevents the vector-of-futures type from being registered, which is helpful.
233 // TODO: figure out how to automate this (add a flag to the parser to outright reject functions based on their parameter and return types).
234 MRMESH_API MR_BIND_IGNORE Expected<std::vector<std::future<Expected<void>>>> serializeRecursive( const std::filesystem::path& path, Json::Value& root, int childId ) const;
235
239 MRMESH_API Expected<void> deserializeRecursive( const std::filesystem::path& path, const Json::Value& root,
240 ProgressCallback progressCb = {}, int* objCounter = nullptr );
241
246
248 virtual Box3f getWorldBox( ViewportId = {} ) const { return {}; }
251
253 [[nodiscard]] virtual bool hasVisualRepresentation() const { return false; }
254
257 [[nodiscard]] virtual bool hasModel() const { return false; }
258
261 const std::set<std::string>& tags() const { return tags_; }
265 MRMESH_API bool addTag( std::string tag );
268 MRMESH_API bool removeTag( const std::string& tag );
269
271 [[nodiscard]] MRMESH_API virtual size_t heapBytes() const;
272
276 using XfChangedSignal = Signal<void()>;
278protected:
279 struct ProtectedStruct{ explicit ProtectedStruct() = default; };
280public:
282 Object( ProtectedStruct, const Object& obj ) : Object( obj ) {}
283
284protected:
286 Object( const Object& obj ) = default;
287
293
296 MRMESH_API virtual Expected<std::future<Expected<void>>> serializeModel_( const std::filesystem::path& path ) const;
297
300 MRMESH_API virtual void serializeFields_( Json::Value& root ) const;
301
303 MRMESH_API virtual Expected<void> deserializeModel_( const std::filesystem::path& path, ProgressCallback progressCb = {} );
304
307 MRMESH_API virtual void deserializeFields_( const Json::Value& root );
308
309 std::string name_;
311 ViewportMask visibilityMask_ = ViewportMask::all(); // Prefer to not read directly. Use the getter, as it can be overridden.
312 bool locked_ = false;
313 bool parentLocked_ = false;
314 bool selected_{ false };
315 bool ancillary_{ false };
316 mutable bool needRedraw_{false};
317 std::set<std::string> tags_;
318
319 // This calls `onWorldXfChanged_()` for all children recursively, which in turn emits `worldXfChangedSignal`.
320 // This isn't virtual because it wouldn't be very useful, because it doesn't call itself on the children
321 // (it doesn't use a true recursion, instead imitiating one, presumably to save stack space, though this is unlikely to be an issue).
323 // Emits `worldXfChangedSignal`, but derived classes can add additional behavior to it.
325};
326
327template <typename T>
328std::shared_ptr<const T> Object::find() const
329{
330 for ( const auto & child : children_ )
331 if ( auto res = std::dynamic_pointer_cast<T>( child ) )
332 return res;
333 return {}; // not found
334}
335
336template <typename T>
337std::shared_ptr<const T> Object::find( const std::string_view & name ) const
338{
339 for ( const auto & child : children_ )
340 if ( child->name() == name )
341 if ( auto res = std::dynamic_pointer_cast<T>( child ) )
342 return res;
343 return {}; // not found
344}
345
347
348}
#define MRMESH_API
Definition MRMesh/MRMeshFwd.h:80
#define MRMESH_CLASS
Definition MRMesh/MRMeshFwd.h:84
Definition MRObject.h:37
std::vector< std::shared_ptr< Object > > children_
Definition MRObject.h:56
std::vector< std::weak_ptr< Object > > bastards_
recognized ones
Definition MRObject.h:57
MRMESH_API size_t heapBytes() const
ObjectChildrenHolder & operator=(const ObjectChildrenHolder &) noexcept
Definition MRObject.h:41
MRMESH_API std::shared_ptr< Object > getSharedPtr() const
ObjectChildrenHolder(const ObjectChildrenHolder &) noexcept
Definition MRObject.h:40
ObjectChildrenHolder * parent_
Definition MRObject.h:55
MRMESH_API ObjectChildrenHolder(ObjectChildrenHolder &&) noexcept
named object in the data model
Definition MRObject.h:62
virtual MRMESH_API void setVisibilityMask(ViewportMask viewportMask)
specifies object visibility as bitmask of viewports
Object * parent()
Definition MRObject.h:143
virtual MRMESH_API void applyScale(float scaleFactor)
scale object size (all point positions)
virtual MRMESH_API std::shared_ptr< Object > shallowClone() const
virtual MRMESH_API void resetXf(ViewportId id={})
forgets specific transform in given viewport (or forgets all specific transforms for {}...
MRMESH_API ViewportMask globalVisibilityMask() const
returns all viewports where this object is visible together with all its parents
bool globalVisibility(ViewportMask viewportMask=ViewportMask::any()) const
returns true if this object is visible together with all its parents in any of given viewports
Definition MRObject.h:128
virtual MRMESH_API void removeAllChildren()
detaches all recognized children from this, keeping all unrecognized ones
MRMESH_API bool addTag(std::string tag)
T * asType()
Definition MRObject.h:82
static constexpr const char * ClassNameInPlural() noexcept
return human readable name of subclass in plural form
Definition MRObject.h:78
MRMESH_API void setWorldXf(const AffineXf3f &xf, ViewportId id={})
virtual MRMESH_API bool removeChild(Object *child)
const std::vector< std::shared_ptr< const Object > > & children() const
Definition MRObject.h:167
virtual MRMESH_API void setXf(const AffineXf3f &xf, ViewportId id={})
std::shared_ptr< T > find()
Definition MRObject.h:97
virtual MRMESH_API void setAncillary(bool ancillary)
virtual bool hasModel() const
Definition MRObject.h:257
MRMESH_API void swap(Object &other)
std::string name_
Definition MRObject.h:309
bool isAncillary() const
Definition MRObject.h:196
virtual bool isSelected() const
Definition MRObject.h:191
MRMESH_API Box3f getWorldTreeBox(ViewportId={}) const
returns bounding box of this object and all children visible in given (or default) viewport in world ...
virtual const char * typeName() const
Definition MRObject.h:71
virtual bool getRedrawFlag(ViewportMask) const
this method virtual because others data model types could have dirty flags or something
Definition MRObject.h:210
virtual MRMESH_API void serializeFields_(Json::Value &root) const
MRMESH_API void setVisible(bool on, ViewportMask viewportMask=ViewportMask::all())
sets the object visible in the viewports specified by the mask (by default in all viewports)
MRMESH_API std::shared_ptr< Object > cloneTree() const
clones all tree of this object (except ancillary and unrecognized children)
ViewportProperty< AffineXf3f > xf_
Definition MRObject.h:310
const AffineXf3f & xf(ViewportId id={}, bool *isDef=nullptr) const
Definition MRObject.h:107
std::shared_ptr< Object > find(const std::string_view &name)
Definition MRObject.h:91
const T * asType() const
Definition MRObject.h:84
MRMESH_API bool isGlobalAncillary() const
returns true if the object or any of its ancestors are ancillary
const Object * parent() const
returns parent object in the tree
Definition MRObject.h:142
virtual MRMESH_API Expected< void > deserializeModel_(const std::filesystem::path &path, ProgressCallback progressCb={})
Reads model from file.
const ViewportProperty< AffineXf3f > & xfsForAllViewports() const
returns xfs for all viewports, combined into a single object
Definition MRObject.h:113
virtual void setXfsForAllViewports(ViewportProperty< AffineXf3f > xf)
modifies xfs for all viewports at once
Definition MRObject.h:115
MRMESH_API void sortChildren()
sort recognized children by name
virtual std::string classNameInPlural() const
Definition MRObject.h:79
Object(ProtectedStruct, const Object &obj)
Definition MRObject.h:282
virtual MRMESH_API Expected< std::future< Expected< void > > > serializeModel_(const std::filesystem::path &path) const
MRMESH_API bool isAncestor(const Object *ancestor) const
return true if given object is ancestor of this one, false otherwise
std::shared_ptr< T > find(const std::string_view &name)
Definition MRObject.h:103
virtual MRMESH_API bool detachFromParent()
virtual MRMESH_API void swapSignals_(Object &other)
XfChangedSignal worldXfChangedSignal
Definition MRObject.h:277
virtual MRMESH_API bool addChildBefore(std::shared_ptr< Object > newChild, const std::shared_ptr< Object > &existingChild)
virtual MRMESH_API void swapBase_(Object &other)
swaps whole object (signals too)
const std::vector< std::shared_ptr< Object > > & children()
an object can hold other sub-objects
Definition MRObject.h:161
virtual ViewportMask visibilityMask() const
gets object visibility as bitmask of viewports
Definition MRObject.h:207
MRMESH_API MR_BIND_IGNORE Expected< std::vector< std::future< Expected< void > > > > serializeRecursive(const std::filesystem::path &path, Json::Value &root, int childId) const
virtual MRMESH_API bool select(bool on)
selects the object, returns true if value changed, otherwise returns false
bool isVisible(ViewportMask viewportMask=ViewportMask::any()) const
checks whether the object is visible in any of the viewports specified by the mask (by default in any...
Definition MRObject.h:203
void resetRedrawFlag() const
Definition MRObject.h:211
virtual bool hasVisualRepresentation() const
does the object have any visual representation (visible points, triangles, edges, etc....
Definition MRObject.h:253
MRMESH_API Object * findCommonAncestor(Object &other)
virtual MRMESH_API bool addChild(std::shared_ptr< Object > child, bool recognizedChild=true)
bool removeChild(const std::shared_ptr< Object > &child)
returns false if it was not child of this
Definition MRObject.h:182
static constexpr const char * ClassName() noexcept
return human readable name of subclass
Definition MRObject.h:74
MRMESH_API void sendWorldXfChangedSignal_()
MRMESH_API bool removeTag(const std::string &tag)
Object(Object &&) noexcept=default
MRMESH_API std::shared_ptr< const Object > find(const std::string_view &name) const
finds a direct child by name
std::set< std::string > tags_
Definition MRObject.h:317
const std::set< std::string > & tags() const
Definition MRObject.h:261
Object()=default
virtual void setLocked(bool on)
Definition MRObject.h:134
Object(const Object &obj)=default
user should not be able to call copy implicitly, use clone() function instead
MRMESH_API std::shared_ptr< Object > shallowCloneTree() const
virtual void setParentLocked(bool lock)
Definition MRObject.h:139
virtual void setName(std::string name)
Definition MRObject.h:87
bool isLocked() const
object properties lock for UI
Definition MRObject.h:133
virtual MRMESH_API std::vector< std::string > getInfoLines() const
return several info lines that can better describe object in the UI
virtual MRMESH_API size_t heapBytes() const
returns the amount of memory this object occupies on heap
MRMESH_API AffineXf3f worldXf(ViewportId id={}, bool *isDef=nullptr) const
virtual MRMESH_API std::shared_ptr< Object > clone() const
clones current object only, without parent and/or children
virtual MRMESH_API void onWorldXfChanged_()
MRMESH_API Expected< void > deserializeRecursive(const std::filesystem::path &path, const Json::Value &root, ProgressCallback progressCb={}, int *objCounter=nullptr)
bool isParentLocked() const
Definition MRObject.h:138
const std::string & name() const
Definition MRObject.h:86
virtual Box3f getWorldBox(ViewportId={}) const
returns bounding box of this object in world coordinates for default or specific viewport
Definition MRObject.h:248
const Object * findCommonAncestor(const Object &other) const
Definition MRObject.h:152
MRMESH_API void setGlobalVisibility(bool on, ViewportMask viewportMask=ViewportMask::any())
if true sets all predecessors visible, otherwise sets this object invisible
virtual MRMESH_API void deserializeFields_(const Json::Value &root)
virtual std::string className() const
Definition MRObject.h:75
Definition MRViewportId.h:16
stores mask of viewport unique identifiers
Definition MRViewportId.h:42
static ViewportMask any()
Definition MRViewportId.h:50
static ViewportMask all()
mask meaning all or any viewports
Definition MRViewportId.h:49
Definition MRViewportProperty.h:17
std::function< bool(float)> ProgressCallback
Definition MRMesh/MRMeshFwd.h:729
std::shared_ptr< const T > find() const
finds a direct child by type
Definition MRObject.h:328
Definition MRCameraOrientationPlugin.h:8
tl::expected< T, E > Expected
Definition MRExpected.h:25
std::array< Vector3f, 3 > MR_BIND_IGNORE
Definition MRMeshBuilderTypes.h:10
Definition MRObject.h:279