MeshLib C++ Docs
Loading...
Searching...
No Matches
MRSceneStateCheck.h
Go to the documentation of this file.
1#pragma once
2
4#include "MRMesh/MRObject.h"
5#include "exports.h"
6
7namespace MR
8{
11
12
15
17struct NoModelCheck {};
18
19template<typename ObjectT>
20std::string getNObjectsLine( unsigned n )
21{
22 switch ( n )
23 {
24 case 1:
25 return std::string( "one " ) + ObjectT::StaticClassName();
26 case 2:
27 return std::string( "two " ) + ObjectT::StaticClassNameInPlural();
28 case 3:
29 return std::string( "three " ) + ObjectT::StaticClassNameInPlural();
30 case 4:
31 return std::string( "four " ) + ObjectT::StaticClassNameInPlural();
32 default:
33 return std::to_string( n ) + " " + ObjectT::StaticClassNameInPlural();
34 }
35}
36
39template<typename ObjectT, bool visualRepresentationCheck, bool modelCheck>
40std::string sceneSelectedExactly( const std::vector<std::shared_ptr<const Object>>& objs, unsigned n )
41{
42 if ( objs.size() != n )
43 return "Select exactly " + getNObjectsLine<ObjectT>( n );
44 for ( const auto& obj : objs )
45 {
46 auto tObj = dynamic_cast<const ObjectT*>( obj.get() );
47 if ( !tObj )
48 return std::string( "Selected object(s) must be " ) + ObjectT::StaticClassName();
49
50 if constexpr ( modelCheck )
51 if ( !tObj->hasModel() )
52 return "Selected object(s) must have valid model";
53
54 if constexpr ( visualRepresentationCheck )
55 if ( !tObj->hasVisualRepresentation() )
56 return "Selected object(s) must have valid visual representation";
57 }
58 return "";
59}
60
63template<typename ObjectT, bool visualRepresentationCheck, bool modelCheck>
64std::string sceneSelectedAtLeast( const std::vector<std::shared_ptr<const Object>>& objs, unsigned n )
65{
66 if ( objs.size() < n )
67 return "Select at least " + getNObjectsLine<ObjectT>( n );
68 unsigned i = 0;
69 for ( const auto& obj : objs )
70 {
71 auto tObj = dynamic_cast<const ObjectT*>( obj.get() );
72 if ( !tObj )
73 continue;
74
75 if constexpr ( modelCheck )
76 if ( !tObj->hasModel() )
77 continue;
78
79 if constexpr ( visualRepresentationCheck )
80 if ( !tObj->hasVisualRepresentation() )
81 continue;
82 ++i;
83 }
84 return ( i >= n ) ?
85 "" :
86 ( "Select at least " + getNObjectsLine<ObjectT>( n ) + " with valid model" );
87}
88
91template<typename ObjectT, bool visualRepresentationCheck, bool modelCheck>
92std::string sceneSelectedAtMost( const std::vector<std::shared_ptr<const Object>>& objs, unsigned n )
93{
94 unsigned i = 0;
95 for ( const auto& obj : objs )
96 {
97 auto tObj = dynamic_cast<const ObjectT*>( obj.get() );
98 if ( !tObj )
99 continue;
100
101 if constexpr ( modelCheck )
102 if ( !tObj->hasModel() )
103 continue;
104
105 if constexpr ( visualRepresentationCheck )
106 if ( !tObj->hasVisualRepresentation() )
107 continue;
108 ++i;
109 }
110 return ( i <= n ) ?
111 "" :
112 ( "Select at most " + getNObjectsLine<ObjectT>( n ) );
113}
114
117extern template MRVIEWER_API std::string getNObjectsLine<ObjectMesh>( unsigned );
118extern template MRVIEWER_API std::string getNObjectsLine<ObjectPoints>( unsigned );
119extern template MRVIEWER_API std::string getNObjectsLine<ObjectLines>( unsigned );
120extern template MRVIEWER_API std::string sceneSelectedExactly<ObjectMesh, true, true>( const std::vector<std::shared_ptr<const Object>>&, unsigned );
121extern template MRVIEWER_API std::string sceneSelectedExactly<ObjectPoints, true, true>( const std::vector<std::shared_ptr<const Object>>&, unsigned );
122extern template MRVIEWER_API std::string sceneSelectedExactly<ObjectLines, true, true>( const std::vector<std::shared_ptr<const Object>>&, unsigned );
123
124
126template<unsigned N, typename ObjectT, typename = void>
128{
129public:
130 virtual ~SceneStateExactCheck() = default;
131 virtual std::string isAvailable( const std::vector<std::shared_ptr<const Object>>& objs ) const override
132 {
134 }
135};
136
137template<unsigned N, typename ObjectT>
139{
140public:
141 virtual ~SceneStateExactCheck() = default;
142 virtual std::string isAvailable( const std::vector<std::shared_ptr<const Object>>& objs ) const override
143 {
145 }
146};
147
148template<unsigned N, typename ObjectT>
150{
151public:
152 virtual ~SceneStateExactCheck() = default;
153 virtual std::string isAvailable( const std::vector<std::shared_ptr<const Object>>& objs ) const override
154 {
156 }
157};
158
160template<unsigned N, typename ObjectT, typename = void>
162{
163public:
164 virtual ~SceneStateAtLeastCheck() = default;
165 virtual std::string isAvailable( const std::vector<std::shared_ptr<const Object>>& objs ) const override
166 {
168 }
169};
170
171template<unsigned N, typename ObjectT>
173{
174public:
175 virtual ~SceneStateAtLeastCheck() = default;
176 virtual std::string isAvailable( const std::vector<std::shared_ptr<const Object>>& objs ) const override
177 {
179 }
180};
181
182template<unsigned N, typename ObjectT>
184{
185public:
186 virtual ~SceneStateAtLeastCheck() = default;
187 virtual std::string isAvailable( const std::vector<std::shared_ptr<const Object>>& objs ) const override
188 {
190 }
191};
192
194template<unsigned N, typename ObjectT, typename = void>
196{
197public:
198 virtual ~SceneStateAtMostCheck() = default;
199 virtual std::string isAvailable( const std::vector<std::shared_ptr<const Object>>& objs ) const override
200 {
202 }
203};
204
205template<unsigned N, typename ObjectT>
207{
208public:
209 virtual ~SceneStateAtMostCheck() = default;
210 virtual std::string isAvailable( const std::vector<std::shared_ptr<const Object>>& objs ) const override
211 {
213 }
214};
215
216template<unsigned N, typename ObjectT>
218{
219public:
220 virtual ~SceneStateAtMostCheck() = default;
221 virtual std::string isAvailable( const std::vector<std::shared_ptr<const Object>>& objs ) const override
222 {
224 }
225};
226
228template<typename ...Checks>
229class SceneStateOrCheck : public Checks...
230{
231public:
232 virtual ~SceneStateOrCheck() = default;
233 virtual std::string isAvailable( const std::vector<std::shared_ptr<const Object>>&objs ) const override
234 {
235 std::vector<std::string> checkRes;
236 checkRes.reserve( sizeof...( Checks ) );
237 ( checkRes.push_back( Checks::isAvailable( objs ) ), ... );
238 std::string combinedRes;
239 for ( int i = 0; i < checkRes.size(); ++i )
240 {
241 if ( checkRes[i].empty() )
242 return "";
243
244 if ( i != 0 )
245 checkRes[i].front() = ( char )tolower( checkRes[i].front() );
246
247 combinedRes += checkRes[i];
248 if ( i + 1 < checkRes.size() )
249 combinedRes += " or ";
250 }
251 return combinedRes;
252 }
253};
254
256template<typename ...Checks>
257class SceneStateAndCheck : public Checks...
258{
259public:
260 virtual ~SceneStateAndCheck() = default;
261 virtual std::string isAvailable( const std::vector<std::shared_ptr<const Object>>& objs ) const override
262 {
263 std::vector<std::string> checkRes;
264 checkRes.reserve( sizeof...( Checks ) );
265 ( checkRes.push_back( Checks::isAvailable( objs ) ), ... );
266 std::string combinedRes;
267 for ( int i = 0; i < checkRes.size(); ++i )
268 {
269 if ( checkRes[i].empty() )
270 continue;
271
272 if ( !combinedRes.empty() )
273 {
274 combinedRes += " and ";
275 checkRes[i].front() = ( char )tolower( checkRes[i].front() );
276 }
277 combinedRes += checkRes[i];
278 }
279 return combinedRes;
280 }
281};
282
283
284}
Interface for checking scene state, to determine availability, also can return string with requiremen...
Definition MRISceneStateCheck.h:17
checks that all of argument checks are true
Definition MRSceneStateCheck.h:258
checks that given vector has at least N objects if type ObjectT
Definition MRSceneStateCheck.h:162
checks that given vector has at most N objects if type ObjectT
Definition MRSceneStateCheck.h:196
check that given vector has exactly N objects if type ObjectT
Definition MRSceneStateCheck.h:128
checks that at least one of argument checks is true
Definition MRSceneStateCheck.h:230
virtual std::string isAvailable(const std::vector< std::shared_ptr< const Object > > &objs) const override
return empty string if all requirements are satisfied, otherwise return first unsatisfied requirement
Definition MRSceneStateCheck.h:210
template std::string getNObjectsLine< ObjectPoints >(unsigned)
virtual std::string isAvailable(const std::vector< std::shared_ptr< const Object > > &objs) const override
return empty string if all requirements are satisfied, otherwise return first unsatisfied requirement
Definition MRSceneStateCheck.h:199
std::string getNObjectsLine(unsigned n)
Definition MRSceneStateCheck.h:20
virtual ~SceneStateExactCheck()=default
virtual std::string isAvailable(const std::vector< std::shared_ptr< const Object > > &objs) const override
Definition MRSceneStateCheck.h:261
virtual std::string isAvailable(const std::vector< std::shared_ptr< const Object > > &objs) const override
Definition MRSceneStateCheck.h:233
virtual std::string isAvailable(const std::vector< std::shared_ptr< const Object > > &objs) const override
return empty string if all requirements are satisfied, otherwise return first unsatisfied requirement
Definition MRSceneStateCheck.h:142
virtual std::string isAvailable(const std::vector< std::shared_ptr< const Object > > &objs) const override
return empty string if all requirements are satisfied, otherwise return first unsatisfied requirement
Definition MRSceneStateCheck.h:165
template std::string getNObjectsLine< ObjectMesh >(unsigned)
template std::string sceneSelectedExactly< ObjectPoints, true, true >(const std::vector< std::shared_ptr< const Object > > &, unsigned)
virtual std::string isAvailable(const std::vector< std::shared_ptr< const Object > > &objs) const override
return empty string if all requirements are satisfied, otherwise return first unsatisfied requirement
Definition MRSceneStateCheck.h:221
virtual std::string isAvailable(const std::vector< std::shared_ptr< const Object > > &objs) const override
return empty string if all requirements are satisfied, otherwise return first unsatisfied requirement
Definition MRSceneStateCheck.h:153
std::string sceneSelectedAtMost(const std::vector< std::shared_ptr< const Object > > &objs, unsigned n)
Definition MRSceneStateCheck.h:92
virtual ~SceneStateAtLeastCheck()=default
virtual std::string isAvailable(const std::vector< std::shared_ptr< const Object > > &objs) const override
return empty string if all requirements are satisfied, otherwise return first unsatisfied requirement
Definition MRSceneStateCheck.h:131
virtual std::string isAvailable(const std::vector< std::shared_ptr< const Object > > &objs) const override
return empty string if all requirements are satisfied, otherwise return first unsatisfied requirement
Definition MRSceneStateCheck.h:176
template std::string sceneSelectedExactly< ObjectLines, true, true >(const std::vector< std::shared_ptr< const Object > > &, unsigned)
std::string sceneSelectedExactly(const std::vector< std::shared_ptr< const Object > > &objs, unsigned n)
Definition MRSceneStateCheck.h:40
std::string sceneSelectedAtLeast(const std::vector< std::shared_ptr< const Object > > &objs, unsigned n)
Definition MRSceneStateCheck.h:64
virtual std::string isAvailable(const std::vector< std::shared_ptr< const Object > > &objs) const override
return empty string if all requirements are satisfied, otherwise return first unsatisfied requirement
Definition MRSceneStateCheck.h:187
virtual ~SceneStateOrCheck()=default
virtual ~SceneStateAtMostCheck()=default
template std::string getNObjectsLine< ObjectLines >(unsigned)
virtual ~SceneStateAndCheck()=default
template std::string sceneSelectedExactly< ObjectMesh, true, true >(const std::vector< std::shared_ptr< const Object > > &, unsigned)
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
special struct for disabling model check
Definition MRSceneStateCheck.h:17
special struct for disabling visual representation check
Definition MRSceneStateCheck.h:14