PluginFunctions.hh 24.7 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
2
3
*                                                                            *
*                              OpenFlipper                                   *
Jan Möbius's avatar
Jan Möbius committed
4
*      Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen       *
Jan Möbius's avatar
Jan Möbius committed
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
*                           www.openflipper.org                              *
*                                                                            *
*--------------------------------------------------------------------------- *
*  This file is part of OpenFlipper.                                         *
*                                                                            *
*  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 with the               *
*  following exceptions:                                                     *
*                                                                            *
*  If other files instantiate templates or use macros                        *
*  or inline functions from this file, or you compile this file and          *
*  link it with other files to produce an executable, this file does         *
*  not by itself cause the resulting executable to be covered by the         *
*  GNU Lesser General Public License. This exception does not however        *
*  invalidate any other reasons why the executable file might be             *
*  covered by the GNU Lesser General Public License.                         *
*                                                                            *
*  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 LesserGeneral Public           *
*  License along with OpenFlipper. If not,                                   *
*  see <http://www.gnu.org/licenses/>.                                       *
*                                                                            *
33
34
35
\*===========================================================================*/

/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
36
37
38
39
40
*                                                                            *
*   $Revision$                                                       *
*   $LastChangedBy$                                                *
*   $Date$                     *
*                                                                            *
41
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60




//=============================================================================
//
//  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
61
#include <QPair>
62
#include <QFileDialog>
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
63

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

Jan Möbius's avatar
   
Jan Möbius committed
66
#include <ACG/Scenegraph/SceneGraph.hh>
67
#include <OpenFlipper/BasePlugin/PluginFunctionsViewControls.hh>
Jan Möbius's avatar
 
Jan Möbius committed
68

69
70
//== FORWARDDECLARATIONS ======================================================
class ViewObjectMarker;
71
class QGLWidget;
72

Jan Möbius's avatar
 
Jan Möbius committed
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/** 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
89
bool getPickedObject(const unsigned int _node_idx , BaseObjectData*& _object);
Jan Möbius's avatar
 
Jan Möbius committed
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104

/** @} */

//=======================================
// 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
105
bool getSourceIdentifiers( std::vector<int>& _identifiers  );
Jan Möbius's avatar
 
Jan Möbius committed
106
107
108
109
110
111
112

/** \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
113
bool getTargetIdentifiers( std::vector<int>& _identifiers  );
Jan Möbius's avatar
 
Jan Möbius committed
114
115
116
117
118
119
120

/** \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
121
bool getAllMeshes( std::vector<int>& _identifiers  );
Jan Möbius's avatar
 
Jan Möbius committed
122
123
124
125
126
127
128

/** \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
129
bool getAllObjectIdentifiers( std::vector<int>& _identifiers  );
Jan Möbius's avatar
 
Jan Möbius committed
130
131
132
133
134
135
136
137
138
139
140
141
142


/** \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
143
bool getObject(  const int _identifier , BaseObject*& _object );
Jan Möbius's avatar
 
Jan Möbius committed
144
145

/** This functions returns the object with the given id regardless of the type of object.
146
 * See get_object(  int _identifier , ject*& _object ) for more details.
Jan Möbius's avatar
 
Jan Möbius committed
147
148
 */
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
149
bool getObject(  const int _identifier , BaseObjectData*& _object );
Jan Möbius's avatar
 
Jan Möbius committed
150

151
152
153
154
155
/** This functions returns the object's id with the given name.
 */
DLLEXPORT
int getObjectId( const QString _name );

Jan Möbius's avatar
 
Jan Möbius committed
156
157
158
159
160
161
/** \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
162
bool objectExists(  const int _identifier );
Jan Möbius's avatar
 
Jan Möbius committed
163
164
165

/// Get the number of available objects
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
166
int objectCount();
Jan Möbius's avatar
 
Jan Möbius committed
167
168
169

/// Get the number of target objects
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
170
int targetCount();
Jan Möbius's avatar
 
Jan Möbius committed
171
172
173

/// Get the number of source objects
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
174
int sourceCount();
Jan Möbius's avatar
 
Jan Möbius committed
175
176
177

/// Get the number of visible objects
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
178
int visibleCount();
Jan Möbius's avatar
 
Jan Möbius committed
179
180
181
182
183
184
185
186

/** @} */

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

188
189
190
191
192

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

193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
/** \brief Disable the core light handling
*
* Use this function to disable OpenFlippers Core light handling.
* Use this function only if the light is handled by your plugin
* Normally this function is called by the light plugin which
* fully takes control over the glLighting and adds its own light nodes.
*/
DLLEXPORT
void disableExaminerLightHandling();

/** \brief returns if internal light handling is active.
*
* Internal light handling could only be deactivated. From than on a plugin
* has to manage all light handling.
*/
DLLEXPORT
bool examinerLightHandling();

Jan Möbius's avatar
Jan Möbius committed
211
212
/// Set the active id of the examiner which got the last mouse events
DLLEXPORT
213
void setActiveExaminer( const unsigned int _id );
Jan Möbius's avatar
 
Jan Möbius committed
214

215
216
217
218
/// Get the id of the examiner which got the last mouse events
DLLEXPORT
unsigned int activeExaminer();

219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
/// Get the encoded view for the active examiner
DLLEXPORT
QString getEncodedExaminerView();

/// Get the encoded view for the given
DLLEXPORT
QString getEncodedExaminerView(int _viewerId);

/// Set the encoded view for the active examiner
DLLEXPORT
void setEncodedExaminerView( QString _view );

/// Set the encoded view for the given
DLLEXPORT
void setEncodedExaminerView(int _viewerId , QString _view );

235
236
237
238
239
240
/**
 * Set center of scene
 */
DLLEXPORT
void setSceneCenter(const ACG::Vec3d& _center, int _viewer );

Jan Möbius's avatar
Jan Möbius committed
241
242
243
244
/** 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
245
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
246
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
247

Jan Möbius's avatar
Jan Möbius committed
248
249
250
/** Execute picking operation on scenegraph
 * This picking function will pick in the specified examiner context
 */
Jan Möbius's avatar
Jan Möbius committed
251
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
252
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
253

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
/** 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);


Henrik Zimmer's avatar
Henrik Zimmer committed
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
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
/** Execute picking operation on scenegraph
 * This picking function will pick in the last active examiner context which is automatically
 * The 3d Position of each target/node element is stored in the _points vector.
 * Set by mouseevents from the core
 */
DLLEXPORT
bool scenegraphRegionPick( ACG::SceneGraph::PickTarget                _pickTarget,
                           const QRegion&                             _region,
                           QList<QPair<unsigned int, unsigned int> >& _list,
                           QVector<ACG::Vec3d>&                       _points);

/** Execute picking operation on scenegraph
 * This picking function will pick in the specified examiner context
 * The 3d Position of each target/node element is stored in the _points vector.
 */
DLLEXPORT
bool scenegraphRegionPick( const unsigned int                         _examiner,
                           ACG::SceneGraph::PickTarget                _pickTarget,
                           const QRegion&                             _region,
                           QList<QPair<unsigned int, unsigned int> >& _list,
                           QVector<ACG::Vec3d>&                       _points);

/** Execute picking operation on scenegraph
 * This picking function will pick in the last active examiner context which is automatically
 * The depth of each target/node element is stored in the _depths vector.
 * Set by mouseevents from the core
 */
DLLEXPORT
bool scenegraphRegionPick( ACG::SceneGraph::PickTarget                _pickTarget,
                           const QRegion&                             _region,
                           QList<QPair<unsigned int, unsigned int> >& _list,
                           QVector<float>&                            _depths);

/** Execute picking operation on scenegraph
 * This picking function will pick in the specified examiner context
 * The depth of each target/node element is stored in the _depths vector.
 */
DLLEXPORT
bool scenegraphRegionPick( const unsigned int                         _examiner,
                           ACG::SceneGraph::PickTarget                _pickTarget,
                           const QRegion&                             _region,
                           QList<QPair<unsigned int, unsigned int> >& _list,
                           QVector<float>&                            _depths);

/** 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,
                           QVector<float>&                            _depths,
                           QVector<ACG::Vec3d>&                       _points);

/** 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,
                           QVector<float>&                            _depths,
                           QVector<ACG::Vec3d>&                       _points);


Jan Möbius's avatar
Jan Möbius committed
340
/** Execute Scenegraph traversal with action and use the last active examiner
Jan Möbius's avatar
Jan Möbius committed
341
342
 *  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
343
 */
Jan Möbius's avatar
 
Jan Möbius committed
344
345
346
DLLEXPORT
void traverse( ACG::SceneGraph::MouseEventAction  &_action );

Jan Möbius's avatar
Jan Möbius committed
347

Jan Möbius's avatar
 
Jan Möbius committed
348
349
/// Get the current Picking mode
DLLEXPORT
350
const std::string pickMode ();
Jan Möbius's avatar
 
Jan Möbius committed
351

Jan Möbius's avatar
Jan Möbius committed
352
/// Set the current Picking mode for all examiner widgets
Jan Möbius's avatar
 
Jan Möbius committed
353
DLLEXPORT
354
void pickMode ( const std::string _mode);
Jan Möbius's avatar
 
Jan Möbius committed
355
356
357

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

Jan Möbius's avatar
Jan Möbius committed
360
361
362
363
/** \brief get scenegraph root node
*
* Get the real root node of the scenegraph.This node is the topmost
* node of the scenegraph. Normally you do not need to use this node.
364
* Exceptyou are writing a renderer plugin.
Jan Möbius's avatar
Jan Möbius committed
365
366
367
* All objects should be added below the data root node which you can get
* with getRootNode().
*/
Dirk Wilden's avatar
Dirk Wilden committed
368
369
370
DLLEXPORT
ACG::SceneGraph::BaseNode* getSceneGraphRootNode();

Jan Möbius's avatar
Jan Möbius committed
371
372
373
374
375
/** \brief Get the root node for data objects
*
* Get the root node for the objects. This node is a separator node.
* All nodes belonging to objects have to be placed below this node.
* Add a separatornode for each object below this node! */
Jan Möbius's avatar
 
Jan Möbius committed
376
377
378
DLLEXPORT
ACG::SceneGraph::BaseNode* getRootNode();

379
380
381
382
383
/** \brief Add a global node
*
* The node will be added as a global node. Only the global status nodes
* will be above this node.
*/
Dirk Wilden's avatar
Dirk Wilden committed
384
DLLEXPORT
Jan Möbius's avatar
Jan Möbius committed
385
void addGlobalNode(ACG::SceneGraph::BaseNode* _node);
Dirk Wilden's avatar
Dirk Wilden committed
386

387
388
389
390
391
392
393
/** \brief Adds a global status node.
*
* The node will be added at the top of the scenegraph, before all other nodes except
* The scenegraphs real node. It will therefore influence all nodes in the scenegraph.
*/
void addGlobalStatusNode(ACG::SceneGraph::BaseNode* _node);

Jan Möbius's avatar
Jan Möbius committed
394
395
396
397
398
399
400
401
/** \brief Add scenegraph node modifing object rendering
*
* This function adds nodes in front of the object root node.
* Therefore all objects renderings will be modified by the
* state changes in the added node. This might be usefull for
* adding for example a slicing node, which adds clipping planes
* such that the objects will be sliced.
*/
Dirk Wilden's avatar
Dirk Wilden committed
402
DLLEXPORT
Jan Möbius's avatar
Jan Möbius committed
403
void addObjectRenderingNode(ACG::SceneGraph::BaseNode* _node);
Dirk Wilden's avatar
Dirk Wilden committed
404

Jan Möbius's avatar
 
Jan Möbius committed
405
406
/// Set the current Action Mode (PickMode,ExamineMode,...)
DLLEXPORT
Jan Möbius's avatar
   
Jan Möbius committed
407
void actionMode ( Viewer::ActionMode _mode);
Jan Möbius's avatar
 
Jan Möbius committed
408
409
410

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

413
414
415
416
417
418
419
420
/// Sets the main QGLWidget for gl data sharing.
DLLEXPORT
void shareGLWidget (QGLWidget* _widget);

/// Returns the main QGLWidget for gl data sharing.
DLLEXPORT
QGLWidget* shareGLWidget ();

Jan Möbius's avatar
 
Jan Möbius committed
421
422
423
424
425
426
427
428
429
430
431
/** 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
432
QPoint mapToGlobal( const QPoint _point );
Jan Möbius's avatar
 
Jan Möbius committed
433
434
435
436
437

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

440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
/** Set current ViewObjectMarker (will be reseted to default on pick mode change)
 *
 * @param _marker Object marker
 */
DLLEXPORT
void setViewObjectMarker (ViewObjectMarker *_marker);

/** Set the default ViewObjectMarker
 *
 * @param _marker Object marker
 */
DLLEXPORT
void setDefaultViewObjectMarker (ViewObjectMarker *_marker);

/// Get the default ViewObjectMarker
DLLEXPORT
ViewObjectMarker* defaultViewObjectMarker ();

Jan Möbius's avatar
 
Jan Möbius committed
458
459
/** @} */

460

Jan Möbius's avatar
 
Jan Möbius committed
461
462
463
464
465
466
//=======================================
// Iterators for object Access
    /** @name Iterators
    * @{ */
//=======================================

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
467
468
469
470
471
typedef QStringList IteratorRestriction;

const QStringList ALL_OBJECTS;
const QStringList TARGET_OBJECTS ("target");
const QStringList SOURCE_OBJECTS ("source");
Jan Möbius's avatar
 
Jan Möbius committed
472
473
474
475

/** \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
476
 * You can choose if the iterator returns only Target, Source or all objects.\n
Jan Möbius's avatar
 
Jan Möbius committed
477
 * Additionally you can set the type of objects returned by the iterator.
Jan Möbius's avatar
Jan Möbius committed
478
 * The ObjectIterator will only return real Objects. Groups are not considered to be objects
Jan Möbius's avatar
 
Jan Möbius committed
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
 */
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
512
   bool operator==( const ObjectIterator& _rhs) const;
Jan Möbius's avatar
 
Jan Möbius committed
513
514

   /// compare iterators
515
   bool operator!=( const ObjectIterator& _rhs) const;
Jan Möbius's avatar
 
Jan Möbius committed
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544

   /// 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
545
546
547
548
549
      /** 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
550
551
};

Jan Möbius's avatar
Jan Möbius committed
552
553
/** \brief Core Data Iterator used to iterate over all objects (Including groups)
 *
Jan Möbius's avatar
Jan Möbius committed
554
555
556
 * 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
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
 * 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
626
627
628
629
630
// /// Return Iterator to Mesh End
// MeshIterator meshes_end();

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

Jan Möbius's avatar
Jan Möbius committed
633
634
/// Return Iterator to Object End
DLLEXPORT
635
BaseObjectIterator baseObjectsEnd();
Jan Möbius's avatar
Jan Möbius committed
636

Jan Möbius's avatar
 
Jan Möbius committed
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
/** @} */

//=======================================
// 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 );

/** @} */

666
667
668
669
670
671
672
673
674

/** \brief Return unique viewer id
 *
 * This function returns a id which is unique to all running Openflippers on that machine.
 * This id changes when you restart the viewer!
 */
DLLEXPORT
int viewerId();

Jan Möbius's avatar
 
Jan Möbius committed
675
676
/// Get the root of the object structure
DLLEXPORT
Jan Möbius's avatar
Jan Möbius committed
677
BaseObject*& objectRoot();
Jan Möbius's avatar
 
Jan Möbius committed
678

679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
/**
 * The same as QFileDialog::getOpenFileName, except the dialog remembers its
 * last location within the file systems and opens at the same location the
 * next time.
 *
 * @param configProperty The name of the property in which to store the
 *                       last location. Should be of the form "Plugin-Foo/OpenBarFile".
 *
 * @param defaultDir If the property doesn't exist yet, defaultDir is used
 *                   as the initial location.
 */
DLLEXPORT
QString getOpenFileName(const QString &configProperty,
                        QWidget * parent = 0, const QString & caption = QString(),
                        const QString & defaultDir = QString(), const QString & filter = QString(),
                        QString * selectedFilter = 0, QFileDialog::Options options = 0);
/**
 * The same as QFileDialog::getSaveFileName, except the dialog remembers its
 * last location within the file systems and opens at the same location the
 * next time.
 *
 * @param configProperty The name of the property in which to store the
 *                       last location. Should be of the form "Plugin-Foo/SaveBarFile".
 *
 * @param defaultDir If the property doesn't exist yet, defaultDir is used
 *                   as the initial location.
 */
DLLEXPORT
QString getSaveFileName(const QString &configProperty,
                        QWidget * parent = 0, const QString & caption = QString(),
                        const QString & defaultDir = QString(), const QString & filter = QString(),
                        QString * selectedFilter = 0, QFileDialog::Options options = 0);

Jan Möbius's avatar
 
Jan Möbius committed
712
713
714
}

#endif //PLUGINFUNCTIONS_HH