PluginFunctions.hh 14.6 KB
Newer Older
Jan Möbius's avatar
 
Jan Möbius committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//=============================================================================
//
//                               OpenFlipper
//        Copyright (C) 2008 by Computer Graphics Group, RWTH Aachen
//                           www.openflipper.org
//
//-----------------------------------------------------------------------------
//
//                                License
//
//  OpenFlipper is free software: you can redistribute it and/or modify
//  it under the terms of the GNU Lesser General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  OpenFlipper is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public License
//  along with OpenFlipper.  If not, see <http://www.gnu.org/licenses/>.
//
//-----------------------------------------------------------------------------
//
//   $Revision$
//   $Author$
//   $Date$
//
//=============================================================================




//=============================================================================
//
//  Standard Functions
//
//=============================================================================

/**
 * \file PluginFunctions.hh
 * This file contains functions which can be used by plugins to access data in the framework.
 */

//
#ifndef PLUGINFUNCTIONS_HH
#define PLUGINFUNCTIONS_HH

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
50
51
#include <QPair>

Jan Möbius's avatar
 
Jan Möbius committed
52
53
#include <OpenFlipper/common/Types.hh>

Jan Möbius's avatar
   
Jan Möbius committed
54
#include <ACG/Scenegraph/SceneGraph.hh>
55
#include <OpenFlipper/BasePlugin/PluginFunctionsViewControls.hh>
Jan Möbius's avatar
 
Jan Möbius committed
56

57

Jan Möbius's avatar
 
Jan Möbius committed
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/** The Namespace PluginFunctions contains functions for all plugins. These functions should be used to get the
 *  objects to work on or to set modes in the examiner widget. */
namespace PluginFunctions {

//=======================================
// Get Source/Target objects
/** @name Active Objects
* @{ */
//=======================================

/** \brief Get the picked mesh
 * @param _node_idx Node index returned by examiner picking
 * @param _object returns the object which contains the mesh
 * @return true if mesh was found, false if picked object is not a mesh or not found
 */
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
74
bool getPickedObject(const unsigned int _node_idx , BaseObjectData*& _object);
Jan Möbius's avatar
 
Jan Möbius committed
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

/** @} */

//=======================================
// Get Objects by their identifier
    /** @name Identifier handling
    * @{ */
//=======================================

/** \brief Get the identifiers of all objects marked as a source object.
 *
 * @param _identifiers ( vector returning the source object identifiers )
 * @return false, if no object is selected as source
*/
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
90
bool getSourceIdentifiers( std::vector<int>& _identifiers  );
Jan Möbius's avatar
 
Jan Möbius committed
91
92
93
94
95
96
97

/** \brief Get the identifiers of all objects marked as a target object.
 *
 * @param _identifiers ( vector returning the target object identifiers )
 * @return false, if no object is selected as target
*/
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
98
bool getTargetIdentifiers( std::vector<int>& _identifiers  );
Jan Möbius's avatar
 
Jan Möbius committed
99
100
101
102
103
104
105

/** \brief Get identifiers of all meshes
 *
 * @param _identifiers ( vector returning the identifiers )
 * @return false, if no mesh is found
*/
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
106
bool getAllMeshes( std::vector<int>& _identifiers  );
Jan Möbius's avatar
 
Jan Möbius committed
107
108
109
110
111
112
113

/** \brief Get identifiers of all objects
 *
 * @param _identifiers ( vector returning the identifiers )
 * @return false, if no mesh is found
*/
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
114
bool getAllObjectIdentifiers( std::vector<int>& _identifiers  );
Jan Möbius's avatar
 
Jan Möbius committed
115
116
117
118
119
120
121
122
123
124
125
126
127


/** \brief Get the object which has the given identifier.
 *
 *  Every loaded object has a unique identifier which is stored in the id field of the object container.
 *  Use this function to get the object which has this id. This can be used for a consistent mapping
 *  even if the data objects change during plugin operations (e.g. selection and main algorithm).\n
 *  This function only returns visible objects.
 * @param _identifier Object id to search for
 * @param _object  returns the object
 * @return Object found?
 */
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
128
bool getObject(  const int _identifier , BaseObject*& _object );
Jan Möbius's avatar
 
Jan Möbius committed
129
130

/** This functions returns the object with the given id regardless of the type of object.
131
 * See get_object(  int _identifier , ject*& _object ) for more details.
Jan Möbius's avatar
 
Jan Möbius committed
132
133
 */
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
134
bool getObject(  const int _identifier , BaseObjectData*& _object );
Jan Möbius's avatar
 
Jan Möbius committed
135
136
137
138
139
140
141

/** \brief Check if an object with this identifier exists.
 *
 * Searches through the Data containers and checks if the object with the given identifier exists
 * @param _identifier  Object id to search for
 */
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
142
bool objectExists(  const int _identifier );
Jan Möbius's avatar
 
Jan Möbius committed
143
144
145

/// Get the number of available objects
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
146
int objectCount();
Jan Möbius's avatar
 
Jan Möbius committed
147
148
149

/// Get the number of target objects
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
150
int targetCount();
Jan Möbius's avatar
 
Jan Möbius committed
151
152
153

/// Get the number of source objects
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
154
int sourceCount();
Jan Möbius's avatar
 
Jan Möbius committed
155
156
157

/// Get the number of visible objects
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
158
int visibleCount();
Jan Möbius's avatar
 
Jan Möbius committed
159
160
161
162
163
164
165
166

/** @} */

//=======================================
// Get/set status of examiner
    /** @name Examiner handling
    * @{ */
//=======================================
Jan Möbius's avatar
Jan Möbius committed
167

168
169
170
171
172

/// Get the number of viewers
DLLEXPORT
int viewers( );

Jan Möbius's avatar
Jan Möbius committed
173
174
/// Set the active id of the examiner which got the last mouse events
DLLEXPORT
175
void setActiveExaminer( const unsigned int _id );
Jan Möbius's avatar
 
Jan Möbius committed
176

177
178
179
180
/// Get the id of the examiner which got the last mouse events
DLLEXPORT
unsigned int activeExaminer();

Jan Möbius's avatar
Jan Möbius committed
181
182
183
184
/** Execute picking operation on scenegraph
 * This picking function will pick in the last active examiner context which is automatically
 * Set by mouseevents from the core
 */
Jan Möbius's avatar
 
Jan Möbius committed
185
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
186
bool scenegraphPick( ACG::SceneGraph::PickTarget _pickTarget, const QPoint &_mousePos, unsigned int &_nodeIdx, unsigned int &_targetIdx, ACG::Vec3d *_hitPointPtr );
Jan Möbius's avatar
 
Jan Möbius committed
187

Jan Möbius's avatar
Jan Möbius committed
188
189
190
/** Execute picking operation on scenegraph
 * This picking function will pick in the specified examiner context
 */
Jan Möbius's avatar
Jan Möbius committed
191
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
192
bool scenegraphPick( const unsigned int _examiner ,ACG::SceneGraph::PickTarget _pickTarget, const QPoint &_mousePos, unsigned int &_nodeIdx, unsigned int &_targetIdx, ACG::Vec3d *_hitPointPtr );
Jan Möbius's avatar
Jan Möbius committed
193

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
/** Execute picking operation on scenegraph
 * This picking function will pick in the last active examiner context which is automatically
 * Set by mouseevents from the core
 */
DLLEXPORT
bool scenegraphRegionPick( ACG::SceneGraph::PickTarget                _pickTarget,
                           const QRegion&                             _region,
                           QList<QPair<unsigned int, unsigned int> >& _list);

/** Execute picking operation on scenegraph
 * This picking function will pick in the specified examiner context
 */
DLLEXPORT
bool scenegraphRegionPick( const unsigned int                         _examiner,
                           ACG::SceneGraph::PickTarget                _pickTarget,
                           const QRegion&                             _region,
                           QList<QPair<unsigned int, unsigned int> >& _list);


Jan Möbius's avatar
Jan Möbius committed
213
/** Execute Scenegraph traversal with action and use the last active examiner
Jan Möbius's avatar
Jan Möbius committed
214
215
 *  If you are reacting on a mouseEvent you should use this function as it will
 *  automatically set the right view
Jan Möbius's avatar
Jan Möbius committed
216
 */
Jan Möbius's avatar
 
Jan Möbius committed
217
218
219
DLLEXPORT
void traverse( ACG::SceneGraph::MouseEventAction  &_action );

Jan Möbius's avatar
Jan Möbius committed
220
/// Execute Scenegraph traversal with action and a specified examiner
221
void traverse(  const unsigned int _examiner, ACG::SceneGraph::MouseEventAction  &_action );
Jan Möbius's avatar
Jan Möbius committed
222

Jan Möbius's avatar
 
Jan Möbius committed
223
224
/// Get the current Picking mode
DLLEXPORT
225
const std::string pickMode ();
Jan Möbius's avatar
 
Jan Möbius committed
226

Jan Möbius's avatar
Jan Möbius committed
227
/// Set the current Picking mode for all examiner widgets
Jan Möbius's avatar
 
Jan Möbius committed
228
229
230
231
232
DLLEXPORT
void pickMode ( std::string _mode);

/// Returns a QImage of the current View
DLLEXPORT
Jan Möbius's avatar
Jan Möbius committed
233
void getCurrentViewImage(QImage& _image);
Jan Möbius's avatar
 
Jan Möbius committed
234

Dirk Wilden's avatar
Dirk Wilden committed
235
236
237
238
/// Get the root node
DLLEXPORT
ACG::SceneGraph::BaseNode* getSceneGraphRootNode();

Jan Möbius's avatar
 
Jan Möbius committed
239
240
241
242
/// Get the root node
DLLEXPORT
ACG::SceneGraph::BaseNode* getRootNode();

Dirk Wilden's avatar
Dirk Wilden committed
243
244
245
246
247
248
249
250
/// Add a node under the root node
DLLEXPORT
void addNode(ACG::SceneGraph::BaseNode* _node);

/// Add a node between root node and its children
DLLEXPORT
void addGlobalNode(ACG::SceneGraph::BaseNode* _node);

Jan Möbius's avatar
 
Jan Möbius committed
251
252
/// Set the current Action Mode (PickMode,ExamineMode,...)
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
253
void actionMode ( Viewer::ActionMode _mode);
Jan Möbius's avatar
 
Jan Möbius committed
254
255
256

/// Get the current Action mode
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
257
258
Viewer::ActionMode actionMode();

Jan Möbius's avatar
 
Jan Möbius committed
259
260
261
262
263
264
265
266
267
268
269
/** Lock scene rotation via mouse
 *
 * @param _mode allow or disallow rotation
 */
DLLEXPORT
void allowRotation(bool _mode);

/** \brief Map coordinates of GL Widget to global coordinates
 *
 */
DLLEXPORT
270
QPoint mapToGlobal( const QPoint _point );
Jan Möbius's avatar
 
Jan Möbius committed
271
272
273
274
275

/** \brief Map global coordinates to GL Widget local coordinates
 *
 */
DLLEXPORT
276
QPoint mapToLocal( const QPoint _point );
Jan Möbius's avatar
 
Jan Möbius committed
277
278
279

/** @} */

280

Jan Möbius's avatar
 
Jan Möbius committed
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
//=======================================
// Iterators for object Access
    /** @name Iterators
    * @{ */
//=======================================

enum IteratorRestriction {
   ALL_OBJECTS,
   TARGET_OBJECTS,
   SOURCE_OBJECTS
};

/** \brief Core Data Iterator
 *
 * This is the core iterator for the whole framework. You should use this iterator to access your data.\n
Jan Möbius's avatar
Jan Möbius committed
296
 * You can choose if the iterator returns only Target, Source or all objects.\n
Jan Möbius's avatar
 
Jan Möbius committed
297
 * Additionally you can set the type of objects returned by the iterator.
Jan Möbius's avatar
Jan Möbius committed
298
 * The ObjectIterator will only return real Objects. Groups are not considered to be objects
Jan Möbius's avatar
 
Jan Möbius committed
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
 */
class DLLEXPORT ObjectIterator {

   public :

      /// type of the Objects the iterator works on
      typedef BaseObjectData  value_type;

      /// handle type (just an int)
      typedef BaseObjectData* value_handle;

      /// reference type
      typedef value_type&     reference;

      /// basic pointer type
      typedef value_type*     pointer;

   /** \brief Use this constructor for iterating through your data.
    *
    * @param _restriction Use this parameter to define which objects will be returned.\n
    *                     You can select between ALL_OBJECTS , TARGET_OBJECTS , SOURCE_OBJECTS.
    * @param _dataType Use this parameter to select the returned object types.
    *                  You can use DATA_ALL DATA_POLY_MESH DATA_TRIANGLE_MESH DATA_VOLUME
    */
   ObjectIterator(IteratorRestriction _restriction = ALL_OBJECTS , DataType _dataType = DATA_ALL );

   /// additional constructor starting at a given position
   ObjectIterator(BaseObjectData* pos, IteratorRestriction _restriction = ALL_OBJECTS , DataType _dataType = DATA_ALL );

   /// return the current position of the iterator
   operator value_handle() { return pos_;  };

   /// compare iterators
   bool operator==( const ObjectIterator& _rhs);

   /// compare iterators
   bool operator!=( const ObjectIterator& _rhs);

   /// assign iterators
   ObjectIterator& operator=( const ObjectIterator& _rhs);

   /// dereference
   pointer operator->();

   /// next element
   ObjectIterator& operator++();

   /// last element
   ObjectIterator& operator--();

   /// dereference the iterator
   BaseObjectData* operator*();

   /// return current position of the iterator
   BaseObjectData* index() { return pos_; };

   private :
      /// current position of the iterator
      BaseObjectData* pos_;

      /// returned data types of the iterator
      DataType dataType_;

      /// Restriction of the iterator
      IteratorRestriction restriction_;

Jan Möbius's avatar
Jan Möbius committed
365
366
367
368
369
      /** Takes an object and goes through the object tree to the next BaseObjectData
        *  It stops at the root node.
        */
      inline void proceedToNextBaseObjectData(BaseObject*& _object);

Jan Möbius's avatar
 
Jan Möbius committed
370
371
};

Jan Möbius's avatar
Jan Möbius committed
372
373
/** \brief Core Data Iterator used to iterate over all objects (Including groups)
 *
Jan Möbius's avatar
Jan Möbius committed
374
375
376
 * This iterator is a more low level one not only returning really visible objects but also
 * Data containers ( e.g. groups... )
 * You can choose if the iterator returns only Target, Source or all objects.\n
Jan Möbius's avatar
Jan Möbius committed
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
 * Additionally you can set the type of objects returned by the iterator.
 */
class DLLEXPORT BaseObjectIterator {

   public :

      /// type of the Objects the iterator works on
      typedef BaseObject  value_type;

      /// handle type (just an int)
      typedef BaseObject* value_handle;

      /// reference type
      typedef value_type&     reference;

      /// basic pointer type
      typedef value_type*     pointer;

   /** \brief Use this constructor for iterating through your data.
    *
    * @param _restriction Use this parameter to define which objects will be returned.\n
    *                     You can select between ALL_OBJECTS , TARGET_OBJECTS , SOURCE_OBJECTS.
    * @param _dataType Use this parameter to select the returned object types.
    *                  You can use DATA_ALL DATA_POLY_MESH DATA_TRIANGLE_MESH DATA_VOLUME
    */
   BaseObjectIterator(IteratorRestriction _restriction = ALL_OBJECTS , DataType _dataType = DATA_ALL );

   /// additional constructor starting at a given position
   BaseObjectIterator(BaseObject* pos, IteratorRestriction _restriction = ALL_OBJECTS , DataType _dataType = DATA_ALL );

   /// return the current position of the iterator
   operator value_handle() { return pos_;  };

   /// compare iterators
   bool operator==( const BaseObjectIterator& _rhs);

   /// compare iterators
   bool operator!=( const BaseObjectIterator& _rhs);

   /// assign iterators
   BaseObjectIterator& operator=( const BaseObjectIterator& _rhs);

   /// dereference
   pointer operator->();

   /// next element
   BaseObjectIterator& operator++();

   /// last element
   BaseObjectIterator& operator--();

   /// dereference the iterator
   BaseObject* operator*();

   /// return current position of the iterator
   BaseObject* index() { return pos_; };

   private :
      /// current position of the iterator
      BaseObject* pos_;

      /// returned data types of the iterator
      DataType dataType_;

      /// Restriction of the iterator
      IteratorRestriction restriction_;

};

Jan Möbius's avatar
 
Jan Möbius committed
446
447
448
449
450
// /// Return Iterator to Mesh End
// MeshIterator meshes_end();

/// Return Iterator to Object End
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
451
ObjectIterator objectsEnd();
Jan Möbius's avatar
 
Jan Möbius committed
452

Jan Möbius's avatar
Jan Möbius committed
453
454
/// Return Iterator to Object End
DLLEXPORT
455
BaseObjectIterator baseObjectsEnd();
Jan Möbius's avatar
Jan Möbius committed
456

Jan Möbius's avatar
 
Jan Möbius committed
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
/** @} */

//=======================================
// Dont Use functions below!!!
    /** @name Do never use!!
    * @{ */
//=======================================

/** Set the global DataContainer*/
DLLEXPORT
void setDataRoot( BaseObject* _root );

/** @} */

//=======================================
    /** @name Getting data from objects and casting between them
     * @{ */
//=======================================

/** \brief Cast an BaseObject to a BaseObjectData if possible
 *
 * @param _object The object should be of type BaseObject. If the content is a BaseObjectData, a
 *                a BaseObjectData is returned. Otherwise a NULL pointer is returned.
 */
DLLEXPORT
BaseObjectData* baseObjectData( BaseObject* _object );

/** @} */

/// Get the root of the object structure
DLLEXPORT
Jan Möbius's avatar
Jan Möbius committed
488
BaseObject*& objectRoot();
Jan Möbius's avatar
 
Jan Möbius committed
489
490
491
492

}

#endif //PLUGINFUNCTIONS_HH