Developer Documentation
Core.cc
1 /*===========================================================================*\
2 * *
3 * OpenFlipper *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openflipper.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenFlipper. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39 * *
40 \*===========================================================================*/
41 
42 
43 
44 
45 
46 
47 
48 //=============================================================================
49 //
50 // CLASS Core - IMPLEMENTATION
51 //
52 //=============================================================================
53 
54 
55 //== INCLUDES =================================================================
56 
57 // -------------------- mview
58 #include "Core.hh"
59 // -------------------- ACG
60 
61 #include <ACG/QtWidgets/QtFileDialog.hh>
62 // -------------------- Qt
63 
64 
69 #include "OpenFlipper/BasePlugin/TextureInterface.hh"
70 #include "OpenFlipper/BasePlugin/INIInterface.hh"
71 
72 #include <OpenFlipper/common/RecentFiles.hh>
73 
74 #include "OpenFlipper/BasePlugin/PluginFunctionsCore.hh"
75 
77 
79 
82 
83 #include <OpenFlipper/widgets/messageBox/StaysOnTopMessageBox.hh>
84 
86 
87 #include <ACG/Scenegraph/MaterialNode.hh>
88 #include <ACG/Scenegraph/SeparatorNode.hh>
89 
90 #ifdef PYTHON_ENABLED
91  #include <PythonInterpreter/PythonInterpreter.hh>
92 #endif
93 
94 #define WIDGET_HEIGHT 800
95 #define WIDGET_WIDTH 800
96 
97 //== IMPLEMENTATION ==========================================================
98 
107 Core::
108 Core() :
109  QObject(),
110  capture_(false),
111  processManager_(0),
112  nextBackupId_(0),
113  nextBackupGroupId_(0),
114  objectRoot_(0),
115  coreWidget_(0),
116  splash_(0)
117 {
118 
119  //init logFile
120  logStream_ = 0;
121  logFile_ = 0;
122 
123  //init nodes
124  root_node_scenegraph_ = new ACG::SceneGraph::SeparatorNode(0, "SceneGraph Root Node");
125 
126  // init global data node
128 
129  // This separator will manage the cores nodes
131 
132  // Coordsys rendering nodes
133  coordsysMaterialNode_ = new ACG::SceneGraph::MaterialNode(core_nodes_,"Coordsys Material Node");
136 
137  // Separator handling the nodes for data
139 
140  // Separator handling the nodes for data
142 
143  // Add ViewMode All
144  ViewMode* vm = new ViewMode();
145  vm->name = "All";
146  vm->icon = "viewmode_all.png";
147  vm->custom = false;
148  vm->visibleToolboxes = QStringList();
149 
150  viewModes_.push_front(vm);
151 
152  //init ViewerProperties (always for 4 Viewers!)
153  std::vector< Viewer::ViewerProperties* > viewerProperties;
154 
155  for (int i=0; i < 4; i++) {
156  Viewer::ViewerProperties* viewerProperty = new Viewer::ViewerProperties(i);
157  viewerProperty->snapshotBaseFileName("snap-Viewer-" + QString::number(i) + ".png");
158  viewerProperties.push_back( viewerProperty );
159  }
160 
161  PluginFunctions::setViewerProperties(viewerProperties);
162 
163  //set viewer defaults
164  OpenFlipper::Options::defaultViewingDirection( PluginFunctions::VIEW_FREE, 0 );
165  OpenFlipper::Options::defaultViewingDirection( PluginFunctions::VIEW_TOP, 1 );
166  OpenFlipper::Options::defaultViewingDirection( PluginFunctions::VIEW_LEFT, 2 );
167  OpenFlipper::Options::defaultViewingDirection( PluginFunctions::VIEW_FRONT, 3 );
168 
169  // Get all relevant Paths and Options from option files
170  setupOptions();
171 
172  // set discriptions for scriptable slots
173  setDescriptions();
174 
175  // Initialize the build in dataTypes
176  initializeTypes();
177 
178  // Initialize the build in updateTypes
179  initializeUpdateTypes();
180 }
181 
191 void
193 
194  // Check library versions
196 
197  // Make root_node available to the plugins ( defined in PluginFunctions.hh)
199 
200  // Topmost node of the scenegraph
202 
203  // Node below the global status nodes. All nodes with global rendering
204  // will be attached here.
206 
207  // Initialize the first object as the root Object for the object tree
208  objectRoot_ = dynamic_cast< BaseObject* > ( new GroupObject("ObjectRoot") );
210 
211  // Bring up the object manager ( has to be done after the rootobject is created)
212  connect(getObjectManager(),SIGNAL(newObject(int)), this ,SLOT(newObject(int)));
213 
214  connect(getObjectManager(),SIGNAL(deletedObject(int)), this ,SLOT(deletedObject(int)));
215 
216  if ( OpenFlipper::Options::gui() ) {
217 
218  // Initialize redraw timer. Will be used to restrict the rendering framerate.
219  redrawTimer_ = new QTimer();
220  redrawTimer_->setSingleShot(true);
221  connect(redrawTimer_, SIGNAL(timeout()), this, SLOT(updateView()),Qt::DirectConnection);
222 
223  // Initialice scenegraph check timer. Will be used to check for changes in the scenegraph
224  scenegraphCheckTimer_ = new QTimer();
225  scenegraphCheckTimer_->setSingleShot(false);
226  connect(scenegraphCheckTimer_, SIGNAL(timeout()), this, SLOT(checkScenegraphDirty()),Qt::DirectConnection);
227 
228  // Will measure the time between redraws
229  redrawTime_ = new QElapsedTimer();
230  redrawTime_->start ();
231 
232  if ( OpenFlipperSettings().value("Core/Gui/splash",true).toBool() ) {
233  QPixmap splashPixmap(OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator() + "splash.png");
234 
235  splash_ = new QSplashScreen(splashPixmap, Qt::SplashScreen | Qt::WindowStaysOnTopHint);
236  splash_->show();
237 
238  splash_->showMessage(tr("Initializing mainwindow") ,
239  Qt::AlignBottom | Qt::AlignLeft , Qt::white);
240  }
241 
243 
244  spinBoxEventFilter_.registerScrollArea(coreWidget_->getToolboxScrollArea());
245  spinBoxEventFilter_.registerScrollArea(coreWidget_->getToolboxArea());
246  spinBoxEventFilter_.registerScrollArea(coreWidget_->getToolbox());
247 
248  connect(coreWidget_, SIGNAL(clearAll()) , this, SLOT(clearAll()));
249  connect(coreWidget_, SIGNAL(loadMenu()) , this, SLOT(loadObject()));
250  connect(coreWidget_, SIGNAL(addEmptyObjectMenu()) , this, SLOT(slotAddEmptyObjectMenu()));
251  connect(coreWidget_, SIGNAL(saveMenu()) , this, SLOT(saveAllObjects()));
252  connect(coreWidget_, SIGNAL(saveToMenu()) , this, SLOT(saveAllObjectsTo()));
253  connect(coreWidget_, SIGNAL(loadIniMenu()) , this, SLOT(loadSettings()));
254  connect(coreWidget_, SIGNAL(saveIniMenu()) , this, SLOT(saveSettings()));
255  connect(coreWidget_, SIGNAL(applyOptions()) , this, SLOT(applyOptions()));
256  connect(coreWidget_, SIGNAL(saveOptions()) , this, SLOT(saveOptions()));
257  connect(coreWidget_, SIGNAL(recentOpen(QAction*)) , this, SLOT(slotRecentOpen(QAction*)));
258  connect(coreWidget_, SIGNAL(exit()) , this, SLOT(slotExit()), Qt::QueuedConnection); // queue to avoid destroying the core widget during event handling
259 
260 
261  connect( coreWidget_, SIGNAL( resizeViewers(int,int) ), this, SLOT( resizeViewers(int,int) ) );
262  connect( coreWidget_, SIGNAL( resizeApplication(int,int) ), this, SLOT( resizeApplication(int,int) ) );
263  connect( coreWidget_, SIGNAL( stopVideoCapture() ), this, SLOT( stopVideoCapture() ) );
264  connect( coreWidget_, SIGNAL( startVideoCapture(QString,int,bool) ), this, SLOT( startVideoCapture(QString,int,bool) ) );
265  connect( coreWidget_, SIGNAL( dragOpenFile(QString)), this, SLOT(loadObject(QString)));
266 
267  connect(coreWidget_, SIGNAL(showPlugins()) , this, SLOT(slotShowPlugins()));
268 
269  connect(coreWidget_, SIGNAL(call(QString,bool&)), this, SLOT(slotCall(QString,bool&)));
270 
271  connect( coreWidget_->logWidget_->openMeshFilterAction_,SIGNAL(toggled(bool)), this, SLOT(enableOpenMeshErrorLog(bool)) );
272 
273  QScreen *screen = QGuiApplication::primaryScreen();
274  QRect rect = screen->geometry();
275 
276  uint width = rect.width();
277  if ( width > 1000 ) {
278  width = 1000;
279  }
280 
281  uint height = rect.height();
282  if ( height > 1000 ) {
283  height = 1000;
284  }
285 
286 #ifdef ARCH_DARWIN
287  width = rect.width() - 300;
288  height = rect.height() - 150;
289 
290 // coreWidget_->setMaximumSize( width, height );
291 #endif
292 
293  coreWidget_->resize(width,height);
294 
295 
296  // Sanity check for OpenGL capabilities!
298 
299 
300  QString titleInfo = OpenFlipper::Options::windowTitle();
301 
302  #ifdef DEBUG
303  titleInfo = titleInfo + " [DEBUG]";
304  #endif
305 
306  if ( OpenFlipper::Options::coreProfile() )
307  titleInfo = titleInfo + " CoreProfile";
308  else
309  titleInfo = titleInfo + " CompatProfile";
310 
311  coreWidget_->setWindowTitle( titleInfo );
312 
313  }
314 
315  // ======================================================================
316  // Create intermediate logger class for Core which will mangle the output
317  // ======================================================================
318  PluginLogger* newlog = new PluginLogger("Core");
319 
320  loggers_.push_back(newlog);
321  connect(this,SIGNAL(log(Logtype, QString )),newlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
322  connect(this,SIGNAL(log(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection);
323 
324  // Connect it to the Master logger
325  if ( OpenFlipper::Options::gui() )
326  connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
327 
328  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
329 
330  // connection to file logger
331  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
332 
333  // ======================================================================
334  // Create a logger class for CoreWidget
335  // ======================================================================
336 
337  if ( OpenFlipper::Options::gui() ){
338  PluginLogger* widgetlog = new PluginLogger("CoreWidget");
339 
340  loggers_.push_back(widgetlog);
341  connect(coreWidget_,SIGNAL(log(Logtype, QString )),widgetlog,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
342  connect(coreWidget_,SIGNAL(log(QString )),widgetlog,SLOT(slotLog(QString )),Qt::DirectConnection);
343 
344  // Connect it to the Master logger
345  connect(widgetlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
346  connect(widgetlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
347  // connection to file logger
348  connect(widgetlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
349  }
350 
351  // ======================================================================
352  // Catch OpenMesh Error logs with an own Logger
353  // ======================================================================
354  newlog = new PluginLogger("Core ( OpenMesh )",LOGERR);
355  omerr().connect(*newlog);
356  omerr().disconnect(std::cerr);
357 
358  loggers_.push_back(newlog);
359 
360  // Connect it to the Master logger
361  if ( OpenFlipper::Options::gui() )
362  connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
363 
364  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
365  // connection to file logger
366  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
367 
368  // ======================================================================
369  // Catch OpenMesh omout logs with an own Logger
370  // ======================================================================
371  newlog = new PluginLogger("Core ( OpenMesh )",LOGINFO);
372  omout().connect(*newlog);
373  omout().disconnect(std::cout);
374 
375  loggers_.push_back(newlog);
376 
377  // Connect it to the Master logger
378  if ( OpenFlipper::Options::gui() )
379  connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
380 
381  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
382  // connection to file logger
383  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
384 
385  // ======================================================================
386  // Catch OpenMesh omlog logs with an own Logger
387  // ======================================================================
388  newlog = new PluginLogger("Core ( OpenMesh )",LOGOUT);
389  omlog().connect(*newlog);
390 
391  loggers_.push_back(newlog);
392 
393  // Connect it to the Master logger
394  if ( OpenFlipper::Options::gui() )
395  connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
396 
397  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
398  // connection to file logger
399  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
400 
401  // ======================================================================
402  // Log Scripting stuff through a separate logger
403  // ======================================================================
404  newlog = new PluginLogger("Scripting",LOGOUT);
405 
406  loggers_.push_back(newlog);
407 
408  // Connect it to the Master logger
409  if ( OpenFlipper::Options::gui() )
410  connect(newlog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
411 
412  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
413  // connection to file logger
414  connect(newlog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
415 
416  // connect signal to logger
417  connect(this,SIGNAL(scriptLog(QString )),newlog,SLOT(slotLog(QString )),Qt::DirectConnection);
418 
419 
420  // ======================================================================
421  // Set up QtScript Environment
422  // ======================================================================
423 
424  // Set a reference to the scriptengine for simple rpc calls
426 
427  connect(&scriptEngine_, SIGNAL( signalHandlerException(const QScriptValue &) ), this, SLOT( slotScriptError(const QScriptValue &) ));
428 
429  // process Events every 500 msecs during script execution
430  scriptEngine_.setProcessEventsInterval( 500 );
431 
432  // Register own print function :
433  QScriptValue printFunction = scriptEngine_.newFunction(myPrintFunction);
434  printFunction.setProperty("textedit",scriptEngine_.newQObject(this));
435  scriptEngine_.globalObject().setProperty("print", printFunction);
436 
437  // Register print to file function :
438  QScriptValue printToFileFunc = scriptEngine_.newFunction(printToFileFunction);
439  scriptEngine_.globalObject().setProperty("printToFile", printToFileFunc);
440  scriptingFunctions_.push_back( "-.printToFile(QString,QString)" );
441 
442  // Register help function :
443  QScriptValue helpFunc = scriptEngine_.newFunction(helpFunction);
444  helpFunc.setProperty("core",scriptEngine_.newQObject(this));
445  scriptEngine_.globalObject().setProperty("help", helpFunc);
446  scriptingFunctions_.push_back( "-.help(QString)" );
447 
448  // Register IdList Type to scripting Engine
449  qScriptRegisterSequenceMetaType< IdList >(&scriptEngine_);
450 
451  // Register Vector of ints Type to scripting Engine
452  qScriptRegisterSequenceMetaType< QVector< int > >(&scriptEngine_);
453 
454  //==========================================================================
455  // Register the 3d Vector Type to the core ( is Vec3d )
456  //==========================================================================
457  qScriptRegisterMetaType(&scriptEngine_,
458  toScriptValueVector,
459  fromScriptValueVector,
460  scriptEngine_.newQObject(&vec3dPrototype_));
461 
462  // set a constructor to allow creation via Vector(x,y,z)
463  QScriptValue ctorVec3 = scriptEngine_.newFunction(createVector);
464  scriptEngine_.globalObject().setProperty("Vector", ctorVec3);
465 
466  //==========================================================================
467  // Register the 4d Vector Type to the core ( is Vec4d )
468  //==========================================================================
469  qScriptRegisterMetaType(&scriptEngine_,
470  toScriptValueVector4,
471  fromScriptValueVector4,
472  scriptEngine_.newQObject(&vec4dPrototype_));
473 
474  // set a constructor to allow creation via Vector(x,y,z)
475  QScriptValue ctorVec4 = scriptEngine_.newFunction(createVector4);
476  scriptEngine_.globalObject().setProperty("Vector4", ctorVec4);
477 
478  //==========================================================================
479  // Register the DataType Class to the core
480  //==========================================================================
481 
482  // Register DataType in QScriptEngine
483  qScriptRegisterMetaType<DataType>(&scriptEngine_,
484  toScriptValueDataType,
485  fromScriptValueDataType,
486  scriptEngine_.newQObject(&DataTypePrototype_));
487 
488  // set a constructor to allow creation via DataType(uint)
489  QScriptValue dataTypector = scriptEngine_.newFunction(createDataType);
490  scriptEngine_.globalObject().setProperty("DataType", dataTypector);
491 
492  //==========================================================================
493  // Register the Matrix Class to the core
494  //==========================================================================
495 
496  // Register Matrix Type to scripting Engine ( is ACG::Matrix4x4d )
497  qScriptRegisterMetaType(&scriptEngine_,
498  toScriptValueMatrix4x4 ,
499  fromScriptValueMatrix4x4,
500  scriptEngine_.newQObject(&matrix4x4Prototype_));
501 
502  // set a constructor to allow creation via Matrix(x,y,z)
503  QScriptValue matrix4x4ctor = scriptEngine_.newFunction(createMatrix4x4);
504  scriptEngine_.globalObject().setProperty("Matrix4x4", matrix4x4ctor);
505 
506  //==========================================================================
507  // Collect Core scripting information
508  //==========================================================================
509 
510  QScriptValue scriptInstance = scriptEngine_.newQObject(this,
511  QScriptEngine::QtOwnership,
512  QScriptEngine::ExcludeChildObjects |
513  QScriptEngine::ExcludeSuperClassMethods |
514  QScriptEngine::ExcludeSuperClassProperties
515  );
516 
517  scriptEngine_.globalObject().setProperty("core", scriptInstance);
518 
519  QScriptValueIterator it(scriptInstance);
520  while (it.hasNext()) {
521  it.next();
522 
524  if ( checkSignal( this, it.name().toLatin1() ) )
525  continue;
526 
527  scriptingFunctions_.push_back( "core." + it.name() );
528 
529  }
530 
531  loadPlugins();
532 
533  if ( OpenFlipper::Options::gui() ) {
534 
535  //register keyBinding for all scripting slots
537 
538  //get keyAssignments from config files
540 
541  if ( OpenFlipper::Options::currentViewMode( ) != "" )
542  coreWidget_->setViewMode( OpenFlipper::Options::currentViewMode() );
543  else
544  coreWidget_->setViewMode("All");
545 
546  // Set the renderer to the one stored in the settings or to default
547  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i ) {
548  connect( coreWidget_->examiner_widgets_[i], SIGNAL(signalMouseEvent(QMouseEvent*)),
549  this , SLOT(slotMouseEvent(QMouseEvent*)));
550  connect( coreWidget_->examiner_widgets_[i], SIGNAL(signalMouseEventIdentify(QMouseEvent*)),
551  this , SLOT(slotMouseEventIdentify(QMouseEvent*)));
552  connect( coreWidget_->examiner_widgets_[i], SIGNAL(signalMouseEventLight(QMouseEvent*)),
553  this , SLOT(slotMouseEventLight(QMouseEvent*)));
554  connect( coreWidget_->examiner_widgets_[i], SIGNAL(signalWheelEvent(QWheelEvent *, const std::string &)),
555  this , SLOT(slotWheelEvent(QWheelEvent *, const std::string &)));
556 
557  connect( coreWidget_->examiner_widgets_[i], SIGNAL( viewUpdated() ),
558  this, SLOT( viewUpdated()) ,Qt::DirectConnection);
559 
560  connect( coreWidget_->examiner_widgets_[i], SIGNAL( viewChanged() ),
561  coreWidget_->examiner_widgets_[i], SLOT( updateGL() ) ,Qt::DirectConnection);
562 
563  // Set post processor
565 
566  // ====================================================
567  // Set renderer
568  // ====================================================
569 
570 
571  // Choose one of the two possible renderers. Shader Pipeline for Core Profile or Classical for Compatibility Profile
572  QString rendererDefault;
573 
574  if ( OpenFlipper::Options::coreProfile() )
575  rendererDefault = "Shader Pipeline Renderer Plugin";
576  else
577  rendererDefault = "Default Classical Renderer Plugin";
578 
579  // Try to get a default renderer Name from the settings file. If it's not there, we fall back to the default set above
580  // based on the current OpenGL Profile
581  QString rendererKey = "Viewer" + QString::number(i)+"/DefaultRenderer";
582  QString rendererName = OpenFlipperSettings().value(rendererKey,rendererDefault).toString();
583 
584  // Check if the renderer is there. If a setting was in the options file, we try it here. Otherwise we are checking the default one.
585  int rendererId = renderManager().getRendererId(rendererName);
586 
587  if ( rendererId == -1 ) {
588 
589  // That failed. So either the one stored in the settings is not available or our default failed.
590  emit log(LOGERR,tr("Stored default renderer \"") + rendererName + tr("\" is not available, trying") + rendererDefault + "!");
591 
592  // Anyway, lets try the default fallback:
593  rendererId = renderManager().getRendererId(rendererDefault);
594 
595  // Successful?
596  if ( rendererId != -1 ) {
597  // Lets set it as the active one
598  renderManager().setActive(rendererId,i);
599  } else {
600  emit log(LOGERR,rendererDefault + tr(" renderer is also not available. Trying to use any other renderer i can find!"));
601 
602  // debug information for this case, print renderer count and their names
603  const unsigned int rendererCount = renderManager().available();
604  emit log(LOGERR,tr("Currently ") + QString::number(rendererCount) + tr(" renderers are available:") );
605  for (unsigned int rendererId = 0 ; rendererId < rendererCount ; ++rendererId )
606  emit log(LOGERR, tr("Renderer ") + QString::number(rendererId) + ": " + renderManager()[rendererId]->name );
607  }
608  } else {
609  renderManager().setActive(rendererId,i);
610  }
611 
612 
613  }
614 
615  // Warn the user in the log and via messagebox, that he is using the build in renderer only
616  if ( renderManager().available() == 1 ) {
617  finishSplash();
618  emit log(LOGERR,tr("No external plugin renderers available!"));
619  emit log(LOGERR,tr("The build in renderer is only a very limited one and is missing many features!"));
620  emit log(LOGERR,tr("You should build and use the other renderers!"));
621 
622  StaysOnTopMessageBox::warning(0,tr( "No external plugin renderers available!"),tr("The build in renderer is only a very limited one and is missing many features.\nYou should build and use the other free renderers shipped with OpenFlipper."));
623  }
624 
625  }
626 
627  // ===============================================================================================
628  // Load Settings from configuration files
629  // ===============================================================================================
630 
631  QStringList optionFiles = OpenFlipper::Options::optionFiles();
632  for ( int i = 0 ; i < (int)optionFiles.size(); ++i) {
633 
634  if (splash_) {
635  splash_->showMessage(tr("Loading Configuration File %1/%2").arg(i+1).arg(optionFiles.size()),
636  Qt::AlignBottom | Qt::AlignLeft , Qt::white);
637  }
638 
639  // Load global ini files. Use only plugin global options from these files as the
640  // rest has been loaded at the beginning.
641  if ( OpenFlipper::Options::gui() )
643 
644  openIniFile( optionFiles[i] ,false,true,false);
645  }
646 
647  if (splash_)
648  splash_->clearMessage();
649 
650  // ===============================================================================================
651  // Load Settings from configuration files
652  // ===============================================================================================
653 
654  if ( OpenFlipper::Options::lang().contains("UTF") || OpenFlipper::Options::lang().contains("utf") ) {
655  emit log(LOGWARN,tr("UTF8-Locale used!"));
656 // emit log(LOGWARN,"Only OFF files are fully supported with UTF8. Others might fail.");
657 // emit log(LOGWARN,"You can change your locale by :");
658 // emit log(LOGWARN,"export LANG=C");
659 // emit log(LOGWARN,"Work is in progress to resolve this issue.");
660  }
661 
662  if ( OpenFlipper::Options::gui() ) {
663 
664  QFile statesFile(OpenFlipper::Options::configDirStr() + OpenFlipper::Options::dirSeparator() + "WindowStates.dat");
665 
666  if (statesFile.exists() ) {
667  QSettings windowStates(OpenFlipper::Options::configDirStr() + OpenFlipper::Options::dirSeparator() + "WindowStates.dat", QSettings::IniFormat);
668 
669  //try to restore the windowState
670  coreWidget_->restoreState (windowStates.value("Core/Window/State").toByteArray ());
671  //try to restore the geometry
672  coreWidget_->restoreGeometry (windowStates.value("Core/Window/Geometry").toByteArray ());
673 
674  coreWidget_->toolSplitter_->restoreState (windowStates.value("Core/ToolSplitter").toByteArray ());
675  coreWidget_->splitter_->restoreState (windowStates.value("Core/LogSplitter").toByteArray ());
676 
677  coreWidget_->show();
678 
679  applyOptions();
680 
681  windowStates.beginGroup ("Core");
682  windowStates.beginGroup ("LogSlider");
683  coreWidget_->slidingLogger_->restoreState (windowStates);
684  windowStates.endGroup ();
685  coreWidget_->toolBox_->restoreState (windowStates);
686  windowStates.endGroup ();
687 
688 
689  // Restore if window was maximized or not
690  if ( windowStates.value("Core/Window/WindowState",false).toBool() )
691  coreWidget_->setWindowState( coreWidget_->windowState() | Qt::WindowMaximized );
692 
693  } else {
694 
695  coreWidget_->show();
696 
697  applyOptions();
698 
699  }
700 
701  if ( splash_ ) {
702  splash_->raise();
703  splash_->showMessage(tr("Ready."), Qt::AlignBottom | Qt::AlignLeft , Qt::white);
704  finishSplash();
705  }
706 
707  // start checking for scenegraph changes
708  scenegraphCheckTimer_->setInterval (1000 / OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate",35).toInt() );
709  scenegraphCheckTimer_->start ();
710  }
711 
712  // System is ready now.
713  OpenFlipper::Options::finishedStartup();
714 
715  QTimer::singleShot(100, this, SLOT(slotExecuteAfterStartup()));
716 
717  // Initialize and connect the logging of the Python interpreter to the core logging facilities
718 
719 #ifdef PYTHON_ENABLED
721 
722  PluginLogger* pythonLog = new PluginLogger("PythonInterpreter");
723 
724  loggers_.push_back(pythonLog);
725 
726  // Connect input from python interpreter to wrapping logger
727  connect(interpreter,SIGNAL(log(Logtype,QString)),pythonLog,SLOT(slotLog(Logtype,QString)),Qt::DirectConnection);
728 
729  // connect output to file logger
730  connect(pythonLog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLogToFile(Logtype, QString )),Qt::DirectConnection);
731 
732  // Connect output to the Master loggers
733  if ( OpenFlipper::Options::gui())
734  connect(pythonLog,SIGNAL(log(Logtype, QString )),coreWidget_,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
735 
736  connect(pythonLog,SIGNAL(log(Logtype, QString )),this,SLOT(slotLog(Logtype, QString )),Qt::DirectConnection);
737 
738 
739 
740  std::cerr << "Connected logger!!! " << std::endl;
741 #endif
742 
743 }
744 
745 
746 //-----------------------------------------------------------------------------
747 
749 {
750 
751  // Delete the objectRoot if it was constructed
752  if ( objectRoot_ != 0 ) {
754  delete objectRoot_;
755  }
756 
757  // Clean up loggers
758  for ( uint i = 0 ; i < loggers_.size(); ++i )
759  delete loggers_[i];
760 
761  delete coreWidget_;
762 }
763 
764 //-----------------------------------------------------------------------------
765 
766 std::vector<PluginInfo>& Core::plugins() {
767  return PluginStorage::plugins();
768 };
769 
770 //-----------------------------------------------------------------------------
771 
772 void
773 Core::slotMouseEventIdentify( QMouseEvent* _event )
774 {
775 // // Dont do anything as a context Menu will popup on right button click
776 // if ( _event->button() == Qt::RightButton )
777 // return;
778 
779  // Only catch left-button clicks
780  if(_event->button() != Qt::LeftButton) return;
781  if(_event->type() != QEvent::MouseButtonRelease) return;
782 
783  const QObject* senderPointer = sender();
784  unsigned int examinerId = 0;
785 
786  if ( senderPointer == 0 ) {
787  std::cerr << "Error : slotMouseEventIdentify directly called! This should only be called by an examiner" << std::endl;
788  } else {
789  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i ) {
790  if ( senderPointer == coreWidget_->examiner_widgets_[i] ) {
791  examinerId = i;
792  if ( OpenFlipper::Options::doSlotDebugging() )
793  emit log(LOGINFO,tr("slotMouseEventIdentify from examiner ") + QString::number(i) );
794  break;
795  }
796  }
797 
798  }
799 
801 
802  // Do picking
803  size_t node_idx, target_idx;
804  ACG::Vec3d hit_point;
805 
806  if(PluginFunctions::scenegraphPick(ACG::SceneGraph::PICK_ANYTHING, _event->pos(), node_idx, target_idx, &hit_point)) {
807 
808  BaseObjectData* object = 0;
809 
810  if(PluginFunctions::getPickedObject(node_idx, object)) {
811  // Request type information widget
812  InformationInterface* infoPlugin = 0;
813  infoPlugin = getInfoPlugin(object->dataType());
814  if(infoPlugin != 0)
815  infoPlugin->slotInformationRequested(_event->pos(), object->dataType());
816  }
817  }
818 }
819 
820 //-----------------------------------------------------------------------------
821 
822 void
823 Core::slotMouseEventLight( QMouseEvent* _event )
824 {
825  const QObject* senderPointer = sender();
826  unsigned int examinerId = 0;
827 
828  if ( senderPointer == 0 ) {
829  std::cerr << "Error : slotMouseEventLight directly called! This should only be called by an examiner" << std::endl;
830  } else {
831  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i ) {
832  if ( senderPointer == coreWidget_->examiner_widgets_[i] ) {
833  examinerId = i;
834  if ( OpenFlipper::Options::doSlotDebugging() )
835  emit log(LOGINFO,tr("slotMouseEventLight from examiner ") + QString::number(i) );
836  break;
837  }
838  }
839 
840  }
841 
843 
844  emit PluginMouseEventLight( _event );
845 
846 
847 }
848 
849 //-----------------------------------------------------------------------------
850 
851 
852 void
853 Core::slotMouseEvent( QMouseEvent* _event )
854 {
855 // // Dont do anything as a context Menu will popup on right button click
856 // if ( _event->button() == Qt::RightButton )
857 // return;
858 
859  const QObject* senderPointer = sender();
860  unsigned int examinerId = 0;
861 
862  if ( senderPointer == 0 ) {
863  std::cerr << "Error : slotMouseEvent directly called! This should only be called by an examiner" << std::endl;
864  } else {
865  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i ) {
866  if ( senderPointer == coreWidget_->examiner_widgets_[i] ) {
867  examinerId = i;
868  if ( OpenFlipper::Options::doSlotDebugging() ) {
869  QString message = tr("slotMouseEvent from examiner ") + QString::number(i) + " with ";
870 
871  if ( _event->type() == QEvent::MouseButtonRelease )
872  message += " MouseButtonRelease";
873  else if ( _event->type() == QEvent::MouseButtonPress )
874  message += " MouseButtonRelease";
875  else if ( _event->type() == QEvent::MouseButtonDblClick )
876  message += " MouseButtonDblClick";
877  else if ( _event->type() == QEvent::MouseMove )
878  message += " MouseMove";
879  else
880  message += tr("unknown event type");
881 
882  emit log(LOGINFO,message );
883  }
884 
885  break;
886 
887  }
888  }
889 
890  }
891 
893 
894  emit PluginMouseEvent(_event );
895 }
896 
897 //-----------------------------------------------------------------------------
898 
899 void
900 Core::slotWheelEvent( QWheelEvent * _event, const std::string & _mode)
901 {
902  const QObject* senderPointer = sender();
903  unsigned int examinerId = 0;
904 
905  if ( senderPointer == 0 ) {
906  std::cerr << "Error : slotWheelEvent directly called! This should only be called by an examiner" << std::endl;
907  } else {
908  for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i ) {
909  if ( senderPointer == coreWidget_->examiner_widgets_[i] ) {
910  examinerId = i;
911  break;
912  }
913  }
914 
915  }
916 
918 
919  emit PluginWheelEvent(_event , _mode );
920 }
921 
922 //-----------------------------------------------------------------------------
923 
924 void
925 Core::slotAddPickMode( const std::string& _mode ) {
926  if ( OpenFlipper::Options::gui() )
927  coreWidget_->addPickMode(_mode);
928 
929 }
930 
931 //-----------------------------------------------------------------------------
932 
933 void
934 Core::slotAddHiddenPickMode( const std::string& _mode ) {
935 
936  if ( OpenFlipper::Options::gui() )
937  coreWidget_->addPickMode(_mode,false,1000,false);
938 
939 }
940 
941 //-----------------------------------------------------------------------------
942 
946 {
947 
948  if (OpenFlipper::Options::doSlotDebugging()) {
949  if (sender() != 0) {
950  if (sender()->metaObject() != 0) {
951  emit log(LOGINFO, tr("updateView() called by ") + QString(sender()->metaObject()->className()));
952  }
953  }
954  }
955 
956  if (!OpenFlipper::Options::gui())
957  return;
958 
959  if (OpenFlipperSettings().value("Core/Gui/glViewer/restrictFrameRate", false).toBool()) {
960 
961  int elapsed = redrawTime_->elapsed();
962 
963  if (elapsed < 1000 / OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate", 35).toInt()) {
964  // redraw time not reached ... waiting for timer event for next redraw
965  if (redrawTimer_->isActive()) {
966  if (OpenFlipper::Options::doSlotDebugging())
967  emit log(LOGINFO,
968  tr("Too early for redraw! Delaying request from ") + QString(sender()->metaObject()->className()));
969  return;
970  }
971 
972  // Start the timer
973  redrawTimer_->start((1000 / OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate", 35).toInt()) - elapsed);
974  return;
975  } else if (redrawTimer_->isActive())
976  redrawTimer_->stop();
977 
978  }
979 
980  redrawTime_->restart();
981 
982  if (!OpenFlipper::Options::sceneGraphUpdatesBlocked() && !OpenFlipper::Options::redrawDisabled()) {
983 
984  for (unsigned int i = 0; i < OpenFlipper::Options::examinerWidgets(); ++i)
985  coreWidget_->examiner_widgets_[i]->updateGL();
986 
987  // Inform plugins of the scene update
988  emit pluginSceneDrawn();
989  }
990 
991 
992 }
993 
994 //-----------------------------------------------------------------------------
995 
997  QApplication::processEvents();
998 }
999 
1000 //-----------------------------------------------------------------------------
1001 
1002 void Core::blockScenegraphUpdates(bool _block) {
1003  if (_block)
1004  OpenFlipper::Options::blockSceneGraphUpdates();
1005  else
1006  OpenFlipper::Options::unblockSceneGraphUpdates();
1007 }
1008 
1009 //-----------------------------------------------------------------------------
1010 
1014  if ( true )
1015  {
1016  // This is a single pass traversal as we only need to check if there is still one node dirty in the graph
1019 
1020  // If the scenegraph is dirty, we have to redraw
1021  if ( action.isDirty () )
1022  emit updateView ();
1023  }
1024 }
1025 
1026 //-----------------------------------------------------------------------------
1027 
1028 void Core::restrictFrameRate( bool _enable ) {
1029  OpenFlipperSettings().setValue("Core/Gui/glViewer/restrictFrameRate",_enable);
1030 }
1031 
1032 //-----------------------------------------------------------------------------
1033 
1034 void Core::setMaxFrameRate( int _rate ) {
1035  OpenFlipperSettings().setValue("Core/Gui/glViewer/maxFrameRate",_rate);
1036  OpenFlipperSettings().setValue("Core/Gui/glViewer/restrictFrameRate",true);
1037 
1038  // update Timer to new framerate
1039  scenegraphCheckTimer_->setInterval (1000 / OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate",35).toInt() );
1040 }
1041 
1042 //-----------------------------------------------------------------------------
1043 
1044 void
1046 {
1047 
1049 
1050  emit allCleared();
1051 
1052  slotScriptInfo( "core" , "clearAll()" );
1053 }
1054 
1055 //-----------------------------------------------------------------------------
1056 
1057 void
1059 {
1060  QTimer* timer = new QTimer();
1061  connect(timer, SIGNAL(timeout()), this, SLOT(slotExit()));
1062  timer->start(100);
1063 
1064 
1065  QApplication::quit();
1066 }
1067 
1068 //-----------------------------------------------------------------------------
1069 
1070 void Core::fullscreen( bool _state ) {
1071  if ( OpenFlipper::Options::gui() )
1072  coreWidget_->setFullscreen(_state);
1073 }
1074 
1075 //-----------------------------------------------------------------------------
1076 
1077 void Core::showViewModeControls( bool _show ) {
1078  if ( OpenFlipper::Options::gui() ) {
1080  }
1081 }
1082 
1083 //-----------------------------------------------------------------------------
1084 
1085 void Core::loggerState(int _state) {
1087  if ( OpenFlipper::Options::gui() &&
1088  (state == OpenFlipper::Options::Hidden ||
1089  state == OpenFlipper::Options::InScene ||
1090  state == OpenFlipper::Options::Normal))
1091  coreWidget_->showLogger(state);
1092 }
1093 
1094 //-----------------------------------------------------------------------------
1095 
1096 void Core::enableOpenMeshErrorLog(bool _state) {
1097  std::cerr << "Script" << std::endl;
1098 
1099  // Set the state on openmesh stream
1100  if ( _state ) {
1101  omerr().enable();
1102  } else {
1103  omerr().disable();
1104  }
1105 
1106  if ( OpenFlipper::Options::gui() ) {
1107  // store in application settings
1108  OpenFlipperSettings().setValue("Core/Gui/LogWindow/OpenMeshErrors",_state);
1109 
1110  coreWidget_->logWidget_->openMeshFilterAction_->blockSignals(true);
1111  coreWidget_->logWidget_->openMeshFilterAction_->setChecked(_state);
1112  coreWidget_->logWidget_->openMeshFilterAction_->blockSignals(false);
1113  }
1114 
1115 }
1116 
1117 //-----------------------------------------------------------------------------
1118 
1119 void Core::showToolbox( bool _state ) {
1120  if ( OpenFlipper::Options::gui() )
1121  coreWidget_->showToolbox(_state);
1122 }
1123 
1124 //-----------------------------------------------------------------------------
1125 
1126 void Core::showStatusBar( bool _state ) {
1127  if ( OpenFlipper::Options::gui() )
1128  coreWidget_->showStatusBar(_state);
1129 }
1130 
1131 //-----------------------------------------------------------------------------
1132 
1133 void Core::multiViewMode( int _mode ) {
1134  if ( !OpenFlipper::Options::gui() || !OpenFlipperSettings().value("Core/Gui/glViewer/useMultipleViewers",true).toBool() )
1135  return;
1136 
1137  coreWidget_->setViewerLayout(_mode);
1138 
1139 }
1140 
1141 
1142 
1143 
1144 //-----------------------------------------------------------------------------
1145 
1146 void
1147 Core::slotRecentOpen(QAction* _action)
1148 {
1149  // Get the recent files lists and datatypes
1150  QStringList recentFiles = OpenFlipperSettings().value("Core/File/RecentFiles", QStringList()).toStringList();
1151  QStringList recentTypes = OpenFlipperSettings().value("Core/File/RecentTypes", QStringList()).toStringList();
1152 
1153  // The type of the file to open is attached to the action as a string.
1154  // the name is the actions text
1155  QString actionTypeName = _action->data().toString();
1156 
1157  // Iterate over all recent files
1158  for (int i = 0 ; i < recentFiles.size() ; ++i )
1159 
1160  // If the name matches and also the type, we open it.
1161  if ( (recentFiles[i] == _action->text()) && ( actionTypeName == recentTypes[i] ) ){
1162 
1163  OpenFlipper::Options::loadingRecentFile(true);
1164  loadObject(typeId(recentTypes[i]), recentFiles[i]);
1165  coreWidget_->addRecent(recentFiles[i],typeId(recentTypes[i]) );
1166  OpenFlipper::Options::loadingRecentFile(false);
1167 
1168  return;
1169  }
1170 
1171  emit log(LOGERR, tr("Unable to open recent. Unable to find %1 with datatype %2 in recent files list.").arg(_action->text()).arg(actionTypeName) );
1172 
1173 }
1174 
1175 //-----------------------------------------------------------------------------
1176 
1177 void
1179  QString inifile = OpenFlipper::Options::configDirStr() + OpenFlipper::Options::dirSeparator() + "OpenFlipper.ini";
1180 
1181  INIFile ini;
1182 
1183  if ( ! ini.connect( inifile,true) ) {
1184  emit log(LOGERR,tr("Can not create user ini file"));
1185  } else {
1187  ini.disconnect();
1188  }
1189 
1190 
1191  //store the windowState
1192  if ( OpenFlipper::Options::gui() ) {
1193 
1194  QSettings windowStates(OpenFlipper::Options::configDirStr() + OpenFlipper::Options::dirSeparator() + "WindowStates.dat", QSettings::IniFormat);
1195 
1196  windowStates.setValue("Core/Window/State", coreWidget_->saveState ());
1197  windowStates.setValue("Core/Window/Geometry", coreWidget_->saveGeometry ());
1198  windowStates.setValue("Core/Window/WindowState", coreWidget_->isMaximized() );
1199 
1200  windowStates.setValue ("Core/ToolSplitter", coreWidget_->toolSplitter_->saveState ());
1201  windowStates.setValue ("Core/LogSplitter", coreWidget_->splitter_->saveState ());
1202 
1203  windowStates.beginGroup ("Core");
1204  windowStates.beginGroup ("LogSlider");
1205  coreWidget_->slidingLogger_->saveState (windowStates);
1206  windowStates.endGroup ();
1207  coreWidget_->toolBox_->saveState (windowStates);
1208  windowStates.endGroup ();
1209  }
1210 
1211 }
1212 
1213 //-----------------------------------------------------------------------------
1214 
1216  // Write all information on application exit
1217  writeOnExit();
1218 
1219  // Call clearAll() before closing application
1220  // in order to call all object's destructors...
1221  clearAll();
1222 
1223  // Notify plugins of imminent exit.
1224  for ( uint i = 0 ; i < plugins().size() ; ++i ){
1225  BaseInterface* basePlugin = qobject_cast< BaseInterface * >(plugins()[i].plugin);
1226 
1227  // Dont call exit if we cannot get the Plugin
1228  if ( basePlugin )
1229  basePlugin->exit();
1230  }
1231 
1232  // Delete Plugins to actually call their destructor
1233  for(PluginInfo p : plugins())
1234  delete p.plugin;
1235 
1236  // close the log file to ensure everything is writeen correctly
1237  if (logFile_)
1238  logFile_->close();
1239 
1240  // Close the settings file
1241  OpenFlipper::Options::closeSettings();
1242 
1243  // Test if ini-file should be cleaned
1244  // If so, delete it...
1245  if(OpenFlipper::Options::deleteIniFile()) {
1246  bool success = true;
1247 
1248  // Iterate over all ini files and clear them
1249  QStringList optionFiles = OpenFlipper::Options::optionFiles();
1250  for ( int i = 0 ; i < (int)optionFiles.size(); ++i) {
1251  success &= QFile::remove(optionFiles[i]);
1252  }
1253 
1254  if(!success) {
1255  QMessageBox::warning(0, tr("Warning"),
1256  tr("One or more files could not be removed.\nDelete files manually."),
1257  QMessageBox::Ok,
1258  QMessageBox::Ok);
1259  }
1260  }
1261 
1262  // Cleanup the widgets here
1263  delete coreWidget_;
1264 
1265  qApp->quit();
1266 }
1267 
1268 //-----------------------------------------------------------------------------
1269 
1271 
1272  // Call clearAll() before closing application
1273  // in order to call all object's destructors...
1274  clearAll();
1275 
1276  // Cleanup the widgets here
1277  delete coreWidget_;
1278 
1279 
1280  //stop qt event loop
1281  //this function does return to the caller
1282  qApp->exit(EXIT_FAILURE);
1283 
1284  // Kill application with an error
1285  // No need to clean up here anyway
1286  exit(EXIT_FAILURE);
1287 
1288 }
1289 
1290 //-----------------------------------------------------------------------------
1291 
1293 void Core::slotLogToFile(Logtype _type, QString _message){
1294 
1295  if (!OpenFlipperSettings().value("Core/Log/logFileEnabled",true).toBool() )
1296  return;
1297 
1298  if (logStream_ == 0){
1299  //check if a logfile has been specified and if the path is valid
1300 
1301  QString fileName = OpenFlipperSettings().value("Core/Log/logFile","").toString();
1302  QFileInfo fi( fileName );
1303 
1304  if ( fileName == "" || !fi.dir().exists() ) {
1305  OpenFlipperSettings().setValue("Core/Log/logFile", OpenFlipper::Options::configDirStr() + OpenFlipper::Options::dirSeparator() + "OpenFlipper.log");
1306  }
1307 
1308  logFile_ = new QFile( OpenFlipperSettings().value("Core/Log/logFile").toString() );
1309  if ( logFile_->open(QFile::WriteOnly) ) {
1310  logStream_ = new QTextStream (logFile_);
1311  } else {
1312  emit log(LOGERR, tr("Unable to open logfile!"));
1313  return;
1314  }
1315  }
1316 
1317  switch (_type) {
1318  case LOGINFO:
1319  (*logStream_) << "INFO:"; break;
1320  case LOGOUT:
1321  (*logStream_) << "OUT :"; break;
1322  case LOGWARN:
1323  (*logStream_) << "WARN:"; break;
1324  case LOGERR:
1325  (*logStream_) << "ERR :"; break;
1326  case LOGSTATUS:
1327  (*logStream_) << "STAT:"; break;
1328  }
1329 
1330  #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
1331  (*logStream_) << _message << "\n" << flush;
1332  #else
1333  (*logStream_) << _message << "\n" << Qt::flush;
1334  #endif
1335 
1336 }
1337 
1339 void Core::slotSetSlotDescription(QString _slotName, QString _slotDescription,
1340  QStringList _parameters, QStringList _descriptions)
1341 {
1342  //handle core slots
1343  if (sender() == this){
1344  SlotInfo info;
1345  info.slotName = _slotName;
1346  info.slotDescription = _slotDescription;
1347  info.parameters = _parameters;
1348  info.descriptions = _descriptions;
1349 
1350  coreSlots_.push_back( info );
1351  return;
1352  }
1353 
1354  //handle plugin slots
1355 
1356  //find plugin
1357  PluginInfo* pluginInfo = 0;
1358 
1359  for (uint i=0; i < plugins().size(); i++)
1360  if (plugins()[i].plugin == sender())
1361  pluginInfo = &plugins()[i];
1362 
1363  if (pluginInfo == 0){
1364  emit log(LOGERR, tr("Unable to set slot-description. Plugin not found!"));
1365  return;
1366  }
1367 
1368  SlotInfo info;
1369  info.slotName = _slotName;
1370  info.slotDescription = _slotDescription;
1371  info.parameters = _parameters;
1372  info.descriptions = _descriptions;
1373 
1374  pluginInfo->slotInfos.append( info );
1375 }
1376 
1378 void Core::slotSetSlotDescriptionGlobalFunction(QString _functionName, QString _slotDescription,
1379  QStringList _parameters, QStringList _descriptions)
1380 {
1381  SlotInfo info;
1382  info.slotName = _functionName;
1383  info.slotDescription = _slotDescription;
1384  info.parameters = _parameters;
1385  info.descriptions = _descriptions;
1386 
1387  globalFunctions_.push_back( info );
1388 }
1389 
1391 void Core::slotGetDescription(QString _function, QString& _fnDescription,
1392  QStringList& _parameters, QStringList& _descriptions )
1393 {
1394  QString pluginName = _function.section(".", 0, 0);
1395  QString slotName = _function.section(".", 1, 1);
1396 
1397  // Global function
1398  if ( !_function.contains(".") ) {
1399 
1400  // Only one section, so we have to swap
1401  slotName = pluginName;
1402 
1403  for (int i=0; i < globalFunctions_.count(); i++) {
1404 
1405  if (globalFunctions_[i].slotName == slotName){
1406  _fnDescription = globalFunctions_[i].slotDescription;
1407  _parameters = globalFunctions_[i].parameters;
1408  _descriptions = globalFunctions_[i].descriptions;
1409  return;
1410  }
1411  }
1412  return;
1413  }
1414 
1415  //handle core slots
1416  if (pluginName == "core"){
1417 
1418  _fnDescription = "";
1419  _parameters.clear();
1420  _descriptions.clear();
1421 
1422  for (int i=0; i < coreSlots_.count(); i++)
1423  if (coreSlots_[i].slotName == slotName){
1424  _fnDescription = coreSlots_[i].slotDescription;
1425  _parameters = coreSlots_[i].parameters;
1426  _descriptions = coreSlots_[i].descriptions;
1427  return;
1428  }
1429  return;
1430  }
1431 
1432  //handle plugin slots
1433 
1434  //find plugin
1435  PluginInfo* pluginInfo = 0;
1436 
1437  for (uint i=0; i < plugins().size(); i++)
1438  if (plugins()[i].rpcName == pluginName)
1439  pluginInfo = &plugins()[i];
1440 
1441  if (pluginInfo == 0){
1442  emit log(LOGERR, tr("Unable to get slot-description. Plugin not found!"));
1443  return;
1444  }
1445 
1446  _fnDescription = "";
1447  _parameters.clear();
1448  _descriptions.clear();
1449 
1450  //find slot
1451  for (int i=0; i < pluginInfo->slotInfos.count(); i++)
1452  if (pluginInfo->slotInfos[i].slotName == slotName){
1453  _fnDescription = pluginInfo->slotInfos[i].slotDescription;
1454  _parameters = pluginInfo->slotInfos[i].parameters;
1455  _descriptions = pluginInfo->slotInfos[i].descriptions;
1456  return;
1457  }
1458 }
1459 
1460 void Core::snapshotBaseFileName(QString _fname, unsigned int _viewerId ){
1461 
1462  if ( OpenFlipper::Options::gui() ) {
1463  if ( _viewerId >= OpenFlipper::Options::examinerWidgets() ) {
1464  emit log(LOGERR,tr("Unable to snapshotBaseFileName for viewer ") + QString::number(_viewerId) );
1465  return;
1466  }
1467 
1469  }
1470 
1471 }
1472 
1473 void Core::snapshotFileType(QString _type, unsigned int _viewerId ){
1474 
1475  if ( OpenFlipper::Options::gui() ) {
1476  if ( _viewerId >= OpenFlipper::Options::examinerWidgets() ) {
1477  emit log(LOGERR,tr("Unable to snapshotFileType for viewer ") + QString::number(_viewerId) );
1478  return;
1479  }
1480 
1482  }
1483 
1484 }
1485 
1486 
1487 void Core::snapshotCounterStart(const int _counter, unsigned int _viewerId ){
1488 
1489  if ( OpenFlipper::Options::gui() ) {
1490  if ( _viewerId >= OpenFlipper::Options::examinerWidgets() ) {
1491  emit log(LOGERR,tr("Unable to snapshotFileType for viewer ") + QString::number(_viewerId) );
1492  return;
1493  }
1494 
1495  PluginFunctions::viewerProperties(_viewerId).snapshotCounter( _counter );
1496  }
1497 
1498 }
1499 
1500 void Core::snapshot( unsigned int _viewerId, int _width, int _height, bool _alpha, bool _hideCoordsys, int _numSamples ){
1501 
1502 
1503  if ( OpenFlipper::Options::gui() ) {
1504  if ( _viewerId >= OpenFlipper::Options::examinerWidgets() ) {
1505  emit log(LOGERR,tr("Unable to create snapshot for viewer ") + QString::number(_viewerId) );
1506  return;
1507  }
1508  coreWidget_->examiner_widgets_[_viewerId]->snapshot(_width, _height, _alpha, _hideCoordsys, _numSamples);
1509  }
1510 
1511 }
1512 
1514 
1515  if ( OpenFlipper::Options::gui() )
1517 }
1518 
1519 void Core::applicationSnapshotName(QString _name){
1520 
1521  if ( OpenFlipper::Options::gui() )
1523 }
1524 
1526 
1527  if ( OpenFlipper::Options::gui() )
1529 }
1530 
1531 void Core::viewerSnapshot(QString file_name, bool store_comments,
1532  bool comments_visible_only, bool comments_targeted_only,
1533  bool store_material_info, int snapshot_width, int snapshot_height,
1534  bool snapshot_transparent, bool hide_coord_sys,
1535  int snapshot_multisampling, bool store_view) {
1536 
1537  if ( OpenFlipper::Options::gui() )
1538  coreWidget_->viewerSnapshot(file_name, store_comments,
1539  comments_visible_only, comments_targeted_only,
1540  store_material_info, snapshot_width, snapshot_height,
1541  snapshot_transparent, hide_coord_sys, snapshot_multisampling,
1542  store_view);
1543 }
1544 
1545 
1546 void Core::resizeViewers(int _width, int _height ){
1547  if ( OpenFlipper::Options::gui() ){
1548 
1549  lastWidth_ = coreWidget_->glView_->width();
1550  lastHeight_ = coreWidget_->glView_->height();
1551 
1552  // offset +6, +6: Verified: resizing with current sizes leads to no effect
1553  coreWidget_->glView_->resize(_width+6, _height+6);
1554  }
1555 }
1556 
1557 void Core::resizeApplication(int _width, int _height ){
1558  if ( OpenFlipper::Options::gui() ){
1559 
1560  lastWidth_ = coreWidget_->glView_->width();
1561  lastHeight_ = coreWidget_->glView_->height();
1562 
1563  coreWidget_->resize(_width, _height);
1564  }
1565 }
1566 
1567 void Core::writeVersionNumbers(QString _filename){
1568 
1569  INIFile ini;
1570 
1571  if ( ! ini.connect(_filename,true) ) {
1572  emit log(LOGERR,tr("Failed to connect to _ini file") + _filename);
1573  return;
1574  }
1575 
1576  //add coreVersion
1577  if ( OpenFlipper::Options::isWindows() )
1578  ini.add_entry( "Core" , "VersionWindows" , OpenFlipper::Options::coreVersion() );
1579  else
1580  ini.add_entry( "Core" , "VersionLinux" , OpenFlipper::Options::coreVersion() );
1581 
1582  //add pluginVersions
1583  for (uint i=0; i < plugins().size(); i++){
1584 
1585  if ( OpenFlipper::Options::isWindows() )
1586  ini.add_entry( plugins()[i].name , "VersionWindows" , plugins()[i].version );
1587  else
1588  ini.add_entry( plugins()[i].name , "VersionLinux" , plugins()[i].version );
1589  }
1590 
1591  ini.disconnect();
1592 }
1593 
1594 QList<int> Core::objectList (QString _selection, QStringList _types)
1595 {
1596  QList<int> rv;
1597  DataType ids = 0;
1599 
1600  foreach (QString s, _types)
1601  if (!s.isEmpty ())
1602  ids = typeId (s);
1603 
1604  if (_selection == "source")
1605  selection = PluginFunctions::SOURCE_OBJECTS;
1606  else if (_selection == "target")
1607  selection = PluginFunctions::TARGET_OBJECTS;
1608 
1609  for (auto* o_it : PluginFunctions::objects(selection, ids) )
1610  rv.append (o_it->id ());
1611 
1612  return rv;
1613 }
1614 
1617 
1618  connect(this, SIGNAL(setSlotDescription(QString,QString,QStringList,QStringList)),
1619  this, SLOT(slotSetSlotDescription(QString,QString,QStringList,QStringList)) );
1620 
1621  emit slotSetSlotDescriptionGlobalFunction("printToFile(QString,QString)", tr("Print a message to a file"), QStringList(QString("Filename;Values").split(";")), QStringList(QString("Filename to print into;Arbitrary number of arguments").split(";")));
1622  emit slotSetSlotDescriptionGlobalFunction("help(QString)", tr("Print help about something"), QStringList("Help Entry"), QStringList("help about what?"));
1623 
1624 
1625  emit setSlotDescription("deleteObject(int)", tr("Delete an object from the scene."), QStringList("ObjectId"), QStringList(tr("Id of the object to delete")));
1626  emit setSlotDescription("updateView()", tr("Redraw the contents of the viewer."), QStringList(), QStringList());
1627  emit setSlotDescription("clearAll()", tr("Clear all data objects."), QStringList(), QStringList());
1628  emit setSlotDescription("exitApplication()", tr("Quit OpenFlipper"), QStringList(), QStringList());
1629  emit setSlotDescription("fullscreen(bool)", tr("Enable or disable fullscreen mode"),
1630  QStringList(tr("enabled")) ,
1631  QStringList(tr("Enable or disable fullscreen mode")));
1632  emit setSlotDescription("showViewModeControls(bool)", tr("Show or hide the view mode control box"),
1633  QStringList(tr("Show?")) ,
1634  QStringList());
1635  emit setSlotDescription("loggerState(int)", tr("Change the logger window state"), QStringList(tr("Change the logger window state")), QStringList());
1636  emit setSlotDescription("enableOpenMeshErrorLog(bool)", tr("Enable or disable OpenMesh error logging"), QStringList(tr("OpenMesh error logging enabled")), QStringList());
1637  emit setSlotDescription("showToolbox(bool)", tr("Show or hide toolbox"), QStringList(tr("Show or hide the toolbox")), QStringList());
1638  emit setSlotDescription("showStatusBar(bool)", tr("Show or hide status bar"), QStringList(tr("Show or hide the status bar")), QStringList());
1639  emit setSlotDescription("multiViewMode(int)", tr("Switch MultiView Mode"),
1640  QStringList(tr("Mode")), QStringList(tr("0: One Viewer\n1: Double Viewer\n2: Grid \n3: Horizontal split ")));
1641 
1642  emit setSlotDescription("restrictFrameRate(bool)", tr("Restrict FrameRate to MaxFrameRate"),
1643  QStringList(tr("enabled")), QStringList(tr("restriction switch")));
1644  emit setSlotDescription("setMaxFrameRate(int)", tr("set the maximal framerate (automatically enables framerate restriction)"),
1645  QStringList(tr("frameRate")), QStringList(tr("Maximum frameRate")));
1646  emit setSlotDescription("snapshotBaseFileName(QString)", tr("Set a filename for storing snapshots.")
1647  , QStringList(), QStringList());
1648  emit setSlotDescription("snapshotFileType(QString)", tr("Set a filetype for storing snapshots.")
1649  , QStringList(), QStringList());
1650  emit setSlotDescription("snapshotCounterStart(int)", tr("Set the starting number for the snapshot counter.")
1651  , QStringList("StartValue"), QStringList("Starting number for the counter"));
1652  emit setSlotDescription("snapshot()", tr("Make a snapshot of the viewer. If no filename"
1653  " was set using snapshotBaseFileName() the snapshot is stored"
1654  " in snap.png in the current directory. The captured image will have "
1655  " the same dimensions as the current viewport. "
1656  "For every snapshot a counter is added to the filename."), QStringList(), QStringList());
1657  emit setSlotDescription("snapshot(uint)", tr("Make a snapshot of the viewer with id viewerId. If no filename"
1658  " was set using snapshotBaseFileName() the snapshot is stored"
1659  " in snap.png in the current directory. For every snapshot"
1660  " a counter is added to the filename."), QStringList("viewerId"), QStringList("Id of viewer to be captured (default is 0)"));
1661  emit setSlotDescription("snapshot(uint,int,int)", tr("Make a snapshot of the viewer with id viewerId."
1662  " Pass 0 as viewerId parameter to capture the current viewer. "
1663  " The captured image will have the specified dimensions. "
1664  " If 0 is passed as either width or height parameter, the value will "
1665  " automatically be set to hold the right aspect ratio, respectively. "
1666  " If no filename was set using snapshotBaseFileName() the snapshot is stored"
1667  " in snap.png in the current directory. For every snapshot"
1668  " a counter is added to the filename."), QStringList(QString("viewerId;width;height").split(";")),
1669  QStringList(QString("Id of viewer (default is 0);Width of image;Height of image").split(";")));
1670  emit setSlotDescription("snapshot(uint,int,int,bool)", tr("Make a snapshot of the viewer with id viewerId."
1671  " Pass 0 as viewerId parameter to capture the current viewer. "
1672  " The captured image will have the specified dimensions. "
1673  " If 0 is passed as either width or height parameter, the value will "
1674  " automatically be set to hold the right aspect ratio, respectively. "
1675  " If 0 is passed for both width and height values, the viewport's current "
1676  " dimension is used. Set alpha to true if you want the background to be transparent. "
1677  " If no filename was set using snapshotBaseFileName() the snapshot is stored"
1678  " in snap.png in the current directory. For every snapshot"
1679  " a counter is added to the filename."), QStringList(QString("viewerId;width;height;alpha").split(";")),
1680  QStringList(QString("Id of viewer (default is 0);Width of image;Height of image;Transparent background").split(";")));
1681  emit setSlotDescription("snapshot(uint,int,int,bool,bool)", tr("Make a snapshot of the viewer with id viewerId."
1682  " Pass 0 as viewerId parameter to capture the current viewer. "
1683  " The captured image will have the specified dimensions. "
1684  " If 0 is passed as either width or height parameter, the value will "
1685  " automatically be set to hold the right aspect ratio, respectively. "
1686  " If 0 is passed for both width and height values, the viewport's current "
1687  " dimension is used. Set alpha to true if you want the background to be transparent. "
1688  " The fifth parameter is used to hide the coordinate system in the upper right corner of the screen. "
1689  " If no filename was set using snapshotBaseFileName() the snapshot is stored"
1690  " in snap.png in the current directory. For every snapshot"
1691  " a counter is added to the filename."), QStringList(QString("viewerId;width;height;alpha;hideCoordsys").split(";")),
1692  QStringList(QString("Id of viewer (default is 0);Width of image;Height of image;Transparent background;Hide coordsys node").split(";")));
1693  emit setSlotDescription("snapshot(uint,int,int,bool,bool,int)", tr("Make a snapshot of the viewer with id viewerId."
1694  " Pass 0 as viewerId parameter to capture the current viewer. "
1695  " The captured image will have the specified dimensions. "
1696  " If 0 is passed as either width or height parameter, the value will "
1697  " automatically be set to hold the right aspect ratio, respectively. "
1698  " If 0 is passed for both width and height values, the viewport's current "
1699  " dimension is used. Set alpha to true if you want the background to be transparent. "
1700  " The fifth parameter is used to hide the coordinate system in the upper right corner of the screen. "
1701  " If no filename was set using snapshotBaseFileName() the snapshot is stored"
1702  " in snap.png in the current directory. For every snapshot"
1703  " a counter is added to the filename."), QStringList(QString("viewerId;width;height;alpha;hideCoordsys;numSamples").split(";")),
1704  QStringList(QString("Id of viewer (default is 0);Width of image;Height of image;Transparent background;Hide coordsys node;Number of samples per pixel").split(";")));
1705  emit setSlotDescription("resizeViewer(int,int)", tr("Resize the viewer"),
1706  QString(tr("width,height")).split(","),
1707  QString(tr("new width for the viewer,new height for the viewer")).split(","));
1708  emit setSlotDescription("writeVersionNumbers(QString)", tr("write the current versions of all plugins to INI file"),
1709  QStringList(tr("filename")),
1710  QStringList(tr("fullpath to a file where the versions should be written to.")));
1711  //save slots
1712  emit setSlotDescription("saveObject(int,QString)", tr("Save object to file. If the file exists it will be overwritten."),
1713  QString(tr("object-id,filename")).split(","),
1714  QString(tr("id of the object, complete path and filename")).split(","));
1715  emit setSlotDescription("saveObjectTo(int,QString)", tr("Save object to file. The location can be chosen in a dialog. "
1716  "(only works if GUI is available)"),
1717  QString(tr("object-id,filename")).split(","),
1718  QString(tr("id of the object, initial filename for the dialog")).split(","));
1719  emit setSlotDescription("saveAllObjects()", tr("Saves all target objects. "
1720  "If no filename is available a dialog is shown. (only works if GUI is available)"),QStringList(), QStringList());
1721  emit setSlotDescription("saveAllObjectsTo()", tr("Saves all target objects. The locations can be chosen in dialogs. "
1722  "(only works if GUI is available)"),QStringList(), QStringList());
1723  emit setSlotDescription("saveSettings()", tr("Show the dialog to save the current setting. (only works if GUI is available)"),QStringList(), QStringList());
1724  emit setSlotDescription("saveSettings(QString, bool, bool, bool, bool, bool, bool)", tr("Save the current setting to the supplied file."),
1725  QStringList(tr("filePath,is_saveObjectInfo,is_targetOnly,is_saveAll,is_askOverwrite,is_saveProgramSettings,is_savePluginSettings").split(",")),
1726  QStringList(tr("Path of the file to save the settings to.;Save objects in current setting.;Restrict to targeted objects.;<no idea what this parameter does>;Prompt before overwriting files that already exist (gui mode only).;Save " TOSTRING( PRODUCT_NAME ) " program settings.;Save plugin settings.").split(";")));
1727  //load slots
1728  emit setSlotDescription("loadObject()", tr("Show the dialog to load an object. (only works if GUI is available)"),QStringList(), QStringList());
1729  emit setSlotDescription("loadObject(QString)", tr("Load an object specified in file filename. This automatically determines which file plugin to use."),
1730  QStringList(tr("filename")), QStringList(tr("Filename")));
1731  emit setSlotDescription("getObjectId(QString)", tr("Return identifier of object with specified name. Returns -1 if object was not found."),QStringList(), QStringList());
1732  emit setSlotDescription("loadSettings()", tr("Show the dialog to load settings. (only works if GUI is available)"),QStringList(), QStringList());
1733  emit setSlotDescription("loadSettings(QString)", tr("load settings from file."),QStringList(), QStringList());
1734 
1735  emit setSlotDescription("createWidget(QString,QString)", tr("Create a widget from an ui file"),
1736  QString(tr("Object name,ui file")).split(","),
1737  QString(tr("Name of the new widget in script,ui file to load")).split(","));
1738 
1739  emit setSlotDescription("addToolbox(QString,QWidget*)", tr("Add a widget as a toolbox"),
1740  QString(tr("Toolbox Entry name,Widget")).split(","),
1741  QString(tr("Name of the new widget in the toolbox,Pointer to the new widget")).split(","));
1742 
1743  emit setSlotDescription("addToolbox(QString,QWidget*,QIcon*)", tr("Add a widget as a toolbox"),
1744  QString(tr("Toolbox Entry name,Widget,Icon")).split(","),
1745  QString(tr("Name of the new widget in the toolbox,Pointer to the new widget,Pointer to icon")).split(","));
1746 
1747  emit setSlotDescription("serializeMaterialProperties(int)", tr("Serialize and return the material properties of the supplied object."),
1748  QString(tr("ObjectId")).split(","),
1749  QString(tr("ID of the object")).split(","));
1750 
1751  emit setSlotDescription("deserializeMaterialProperties(int, QString)", tr("Deserialize the supplied material properties into the supplied object."),
1752  QString(tr("ObjectId, SerializedProps")).split(","),
1753  QString(tr("ID of the object,The serialized material properties.")).split(","));
1754 
1755  emit setSlotDescription("addViewModeToolboxes(QString,QString)", tr("Set toolboxes for a viewmode (This automatically adds the view mode if it does not exist)"),
1756  QString(tr("Name,Toolbox List")).split(","),
1757  QString(tr("Name of the Viewmode,seperated list of toolboxes visible in this viewmode")).split(","));
1758 
1759  emit setSlotDescription("addViewModeToolbars(QString,QString)", tr("Set toolbars for a viewmode (This automatically adds the view mode if it does not exist)"),
1760  QString(tr("Name,Toolbar List")).split(","),
1761  QString(tr("Name of the Viewmode,seperated list of toolbars visible in this viewmode")).split(","));
1762 
1763  emit setSlotDescription("addViewModeContextMenus(QString,QString)", tr("Set context Menus for a viewmode (This automatically adds the view mode if it does not exist)"),
1764  QString(tr("Name,Context Menu List")).split(","),
1765  QString(tr("Name of the Viewmode,seperated list of Context Menus visible in this viewmode")).split(","));
1766 
1767  emit setSlotDescription("addViewModeIcon(QString,QString)", tr("Set Icon for a viewmode (This automatically adds the view mode if it does not exist)"),
1768  QString(tr("Name,Icon filename")).split(","),
1769  QString(tr("Name of the Viewmode,filename of the icon (will be taken from OpenFlippers icon directory)")).split(","));
1770 
1771  emit setSlotDescription("objectList(QString,QStringList)", tr("Returns object list"),
1772  QString(tr("Selection type,Object types")).split(","),
1773  QString(tr("Type of object selection (all,source,target),Object type (All,PolyMesh,TriangleMesh,...)")).split(";"));
1774 
1775  emit setSlotDescription("setToolBoxSide(QString)", tr("Determine whether the toolboxes should be displayed on the right or on the left side."),
1776  QStringList(tr("side")), QStringList(tr("The desired side of the toolboxes (either 'left' or 'right')")));
1777 
1778  emit setSlotDescription("getToolbox(QString,QString)", tr("Returns a pointer to the requested toolbox widget if it was found, nullptr, otherwise."),
1779  tr("Plugin Name\rToolbox Name").split("\r"),
1780  tr("The plugin which the requested toolbox belongs to.\rThe name of the requested toolbox.").split("\r"));
1781 
1782  emit setSlotDescription("blockSceneGraphUpdates()", tr("Disable Scenegraph Updates (e.g. before loading or adding a large number of files)"),QStringList(), QStringList());
1783  emit setSlotDescription("unblockSceneGraphUpdates()", tr("Enable Scenegraph Updates (e.g. before loading or adding a large number of files)"),QStringList(), QStringList());
1784  emit setSlotDescription("setView", tr("Set the encoded view for the primary viewport."), QStringList(tr("view")), QStringList(tr("The encoded view. (You can obtain one through \"Copy View\" in the context menu of the coordinates.)")));
1785 
1786 }
1787 
1788 void Core::deleteObject( int _id ){
1789 
1790  if ( _id == -1 )
1791  return;
1792 
1793  // get the node
1794  BaseObject* object = objectRoot_->childExists(_id);
1795 
1796  if ( !object || object == objectRoot_ ) {
1797  std::cerr << "Error while deleting object, does not exist!!" << std::endl;
1798  return;
1799  }
1800 
1801  emit objectDeleted(_id);
1802 
1803  // remove the whole subtree below this item
1804  object->deleteSubtree();
1805 
1806  // remove the item itself from the parent
1807  object->parent()->removeChild(object);
1808 
1809  // delete it
1810  delete object;
1811 
1812  // ensure updating the picking buffer
1813  updateView();
1814 
1815 }
1816 
1817 void Core::deserializeMaterialProperties(int _objId, QString _props) {
1818  if ( _objId == -1 ) return;
1819 
1820  BaseObject* object = objectRoot_->childExists(_objId);
1821 
1822  if (!object || object == objectRoot_) {
1823  std::cerr << "No such object." << std::endl;
1824  return;
1825  }
1826 
1827  BaseObjectData* o = dynamic_cast<BaseObjectData *>(object);
1828  if (!o || !o->materialNode()) {
1829  std::cerr << "No suitable object found." << std::endl;
1830  return;
1831  }
1832 
1833  o->materialNode()->material().deserializeFromJson(_props);
1834 }
1835 
1837  if ( _objId == -1 ) return QString();
1838 
1839  BaseObject* object = objectRoot_->childExists(_objId);
1840 
1841  if (!object || object == objectRoot_) {
1842  std::cerr << "No such object." << std::endl;
1843  return QString();
1844  }
1845 
1846  BaseObjectData* o = dynamic_cast<BaseObjectData *>(object);
1847  if (!o || !o->materialNode()) {
1848  std::cerr << "No suitable object found." << std::endl;
1849  return QString();
1850  }
1851 
1852  return o->materialNode()->material().serializeToJson();
1853 }
1854 
1855 
1856 void Core::setObjectComment(int _id, QString key, QString comment) {
1857  if ( _id == -1 ) return;
1858 
1859  BaseObject* object = objectRoot_->childExists(_id);
1860 
1861  if (!object || object == objectRoot_) {
1862  std::cerr << "No such object." << std::endl;
1863  return;
1864  }
1865 
1866  object->getCommentByKey(key) = comment;
1867 }
1868 
1869 void Core::clearObjectComment(int _id, QString key) {
1870  if ( _id == -1 ) return;
1871 
1872  BaseObject* object = objectRoot_->childExists(_id);
1873 
1874  if (!object || object == objectRoot_) {
1875  std::cerr << "No such object." << std::endl;
1876  return;
1877  }
1878 
1879  object->clearComment(key);
1880 }
1881 
1882 void Core::clearAllComments(int _id) {
1883  if ( _id == -1 ) return;
1884 
1885  BaseObject* object = objectRoot_->childExists(_id);
1886 
1887  if (!object || object == objectRoot_) {
1888  std::cerr << "No such object." << std::endl;
1889  return;
1890  }
1891 
1892  object->clearAllComments();
1893 }
1894 
1895 
1897 
1898  // Remember ids
1899  std::vector< int > ids;
1900 
1901  BaseObject* current = objectRoot_->next();
1902 
1903  while( current != objectRoot_ ){
1904  ids.push_back( current->id() );
1905  current = current->next();
1906  }
1907 
1908  for ( uint i = 0 ; i < ids.size(); ++i ) {
1909  emit objectDeleted(ids[i]);
1910  }
1911 
1912  // remove the whole subtree below the root
1914 
1915  slotObjectUpdated(-1);
1916 
1917  emit allCleared();
1918 }
1919 
1920 //-----------------------------------------------------------------------------
1921 
1923 
1924 // bool ok = true;
1925 // bool warn = false;
1926 
1927  QString messages;
1928 
1929  QString qtCompiledVersion = QString( QT_VERSION_STR );
1930  QString qtCurrentVersion = qVersion();
1931 
1932  if ( qtCompiledVersion != qtCurrentVersion ) {
1933  messages += tr("QT Library Version mismatch!\n");
1934 
1935  messages += tr("Currently used QT Version:\t") + qVersion() + "\n";
1936  messages += tr("Link time QT Version:\t\t") + QString( QT_VERSION_STR ) + "\n";
1937  messages += tr("This inconsistency may lead to an unstable behavior of OpenFlipper!");
1938 
1939 // warn = true;
1940  }
1941 
1942 // if ( !ok ) {
1943 // QString message = tr("Error! Library tests failed!\n");
1944 // message += tr("The following problems have been found:\n\n");
1945 //
1946 // message += messages;
1947 //
1948 // std::cerr << message.toStdString() << std::endl;
1949 //
1950 // if ( OpenFlipper::Options::gui() ) {
1951 // finishSplash();
1952 // StaysOnTopMessageBox::critical ( 0, tr( "Library incompatibilities found!"),message );
1953 // }
1954 //
1955 // // Unsafe operation, so quit the application
1956 // exitFailure();
1957 //
1958 // } else if ( warn ) {
1959 
1960 // QString message = tr("Warning! The OpenGL capabilities of your current machine/driver could be insufficient!\n\n");
1961 // message += tr("The following checks failed:\n\n");
1962 // message += messages;
1963 //
1964 // std::cerr << message.toStdString() << std::endl;
1965 //
1966 // if ( OpenFlipper::Options::gui() ) {
1967 // finishSplash();
1968 // StaysOnTopMessageBox::warning ( 0, tr( "Library incompatibilities found!"),message );
1969 // }
1970 //
1971 // }
1972 
1973  #ifndef NDEBUG
1974  else {
1975  std::cerr << "Library Check succeeded" << std::endl;
1976  return true;
1977  }
1978  #endif
1979 
1980  return true;
1981 }
1982 
1983 //-----------------------------------------------------------------------------
1984 
1985 
1987 
1988  // No gui->no OpenGL
1989  if ( OpenFlipper::Options::nogui() )
1990  return true;
1991 
1992  // Status ok?
1993  bool ok = true;
1994  bool warn = false;
1995 
1996  QString missing;
1997 
1998  QOpenGLContext* context = QOpenGLContext::currentContext();
1999  if ( context ) {
2000 
2001  // Get version and check
2002  QSurfaceFormat format = context->format();
2003 
2004  if ( (format.majorVersion() < 2) ) {
2005 
2006  ok = false;
2007  missing += tr("OpenGL Version less then 2.0!\n");
2008 
2009  }
2010 
2011  } else {
2012  ok = false;
2013  missing += tr("No OpenGL support found!\n");
2014  }
2015 
2016 
2017  if ( !ok ) {
2018  QString message = tr("Error! \nThe OpenGL capabilities of your current machine/driver are not sufficient!\n\n");
2019  message += tr("The following checks failed:\n\n");
2020  message += missing;
2021  message += tr("\n\nPlease update your driver or graphics card.\n");
2022  #ifdef APPLE
2023  message += tr("If you have more than one GPU (e.g. MacBook) don't use the internal one!\n");
2024  #endif
2025 
2026  std::cerr << message.toStdString() << std::endl;
2027 
2028 
2029  finishSplash();
2030  QMessageBox::StandardButton button = StaysOnTopMessageBox::critical ( 0, tr( "Insufficient OpenGL Capabilities!"),message,QMessageBox::Abort|QMessageBox::Ignore , QMessageBox::Abort);
2031 
2032  // Unsafe operation, so quit the application
2033  if ( button == QMessageBox::Abort )
2034  exitFailure();
2035  else {
2036  StaysOnTopMessageBox::warning(0,tr( "Insufficient OpenGL Capabilities!"),tr("Ignoring OpenGL capabilities might lead to unstable Operation! Do it at your own risk!"));
2037  }
2038 
2039 
2040 
2041  } else if ( warn ) {
2042  finishSplash();
2043  QString message = tr("Warning! Automatic system environment checks discovered some possible problems!\n\n");
2044  message += tr("The following checks failed:\n\n");
2045  message += missing;
2046 
2047  std::cerr << message.toStdString() << std::endl;
2048 
2049  StaysOnTopMessageBox::warning ( 0, tr( "Detected possible problems!"),message );
2050 
2051  }
2052  #ifndef NDEBUG
2053  else {
2054  std::cerr << "OpenGL Version Check succeeded" << std::endl;
2055  }
2056  #endif
2057 
2058  return ok;
2059 }
2060 
2061 void Core::showReducedMenuBar(bool reduced) {
2062  coreWidget_->showReducedMenuBar(reduced);
2063 }
2064 
2066  if (splash_) {
2067  splash_->finish(coreWidget_);
2068  splash_->deleteLater();
2069  splash_ = 0;
2070  }
2071 }
2072 
2073 
2074 //=============================================================================
void allCleared()
Signal send to plugins when whole scene is cleared.
bool scenegraphPick(ACG::SceneGraph::PickTarget _pickTarget, const QPoint &_mousePos, size_t &_nodeIdx, size_t &_targetIdx, ACG::Vec3d *_hitPointPtr=0)
Execute picking operation on scenegraph.
void saveAllObjectsTo()
Slot for saving objects to a new location.
QList< SlotInfo > globalFunctions_
Core scripting engine.
Definition: Core.hh:1403
QSplitter * splitter_
Spliter between toplevel objects and the textedit at the bottom.
Definition: CoreWidget.hh:680
void setDescriptions()
set the descriptions for scriptable slots of the core
Definition: Core.cc:1616
QtGLGraphicsView * glView_
graphics view that holds the gl scene
Definition: CoreWidget.hh:713
SeparatorNode * dataRootNode_
Root Node for data objects.
Definition: Core.hh:1092
void exitFailure()
Aborts the application with an error code.
Definition: Core.cc:1270
void slotRecentOpen(QAction *_action)
Open Recent file.
Definition: Core.cc:1147
void clearAllComments(int objId)
Called when a plugin requests an update in the viewer.
Definition: Core.cc:1882
void setDataRoot(BaseObject *_root)
QList< int > objectList(QString _selection, QStringList _types)
return the list of available object that has the given selection and type
Definition: Core.cc:1594
void startVideoCapture(QString _baseName, int _fps, bool _captureViewers)
Start video capturing.
Definition: Video.cc:63
prototypeVec3d vec3dPrototype_
Prototype for the Vector type.
Definition: Core.hh:1351
void writeApplicationOptions(INIFile &_ini)
Write Application options to ini file.
Definition: ParseIni.cc:285
static void loadSavedPostProcessors(const unsigned _examiner)
append all saved post processors
void clearAll()
Clear all data objects.
Definition: Core.cc:1045
void snapshotFileType(QString _type, unsigned int _viewerId=0)
Set the file type for snapshots.
Definition: Core.cc:1473
ACG::SceneGraph::CoordsysNode * coordsysNode_
Node for the coordinate system.
Definition: Core.hh:1098
void showStatusBar(bool _state)
Show or hide Status Bar.
Definition: Core.cc:1126
SeparatorNode * root_node_scenegraph_
Scenegraphs root node.
Definition: Core.hh:1079
SideArea * getToolbox()
Show logger in splitter or not.
Definition: CoreWidget.hh:512
QTextStream * logStream_
stream for logging to file
Definition: Core.hh:1207
ViewMode struct This struct contains a ViewMode and its status information such as used widgets...
Definition: CoreWidget.hh:124
void showToolbox(bool _state)
Show or hide toolbox.
Definition: Core.cc:1119
void clearAllComments()
Get comment for the specified key.
Definition: BaseObject.cc:847
void saveOptions()
Save the current options to the standard ini file.
void disconnect()
Remove connection of this object to a file.
Definition: INIFile.cc:122
QElapsedTimer * redrawTime_
Holds the time since last redraw.
Definition: Core.hh:1475
BaseObject * objectRoot_
Pointer to the data rootNode;.
Definition: Core.hh:1593
void openIniFile(QString _filename, bool _coreSettings, bool _perPluginSettings, bool _loadObjects)
Load information from an ini file.
Definition: ParseIni.cc:400
void setSlotDescription(QString _slotName, QString _slotDescription, QStringList _parameters, QStringList _descriptions)
Core scripting engine.
QList< SlotInfo > slotInfos
This list contains Descriptions about public slots if available.
Definition: PluginInfo.hh:152
bool checkSignal(QObject *_plugin, const char *_signalSignature)
Check if a plugin has a signal.
void viewUpdated()
Slot called everytime the view is updated.
Definition: Video.cc:123
void setActive(unsigned int _active, int _id)
set the active renderer
void showViewModeControls(bool _show)
Hide or show the View Mode controls.
Definition: CoreWidget.cc:700
void add_entry(const QString &_section, const QString &_key, const QString &_value)
Addition / modification of a string entry.
Definition: INIFile.cc:257
int getRendererId(QString _name)
get renderer id with the given name
void loadSettings()
Load status from file.
void slotWheelEvent(QWheelEvent *_event, const std::string &_mode)
Gets called by examiner widget when Wheel is moved in picking mode.
Definition: Core.cc:900
QString & getCommentByKey(const QString &key)
Get comment for the specified key.
Definition: BaseObject.cc:824
QScrollArea * getToolboxScrollArea()
Show logger in splitter or not.
Definition: CoreWidget.hh:510
SeparatorNode * root_node_scenegraph_global_
Seperator node for global nodes.
Definition: Core.hh:1082
QTimer * scenegraphCheckTimer_
Timer that starts scenegraph check.
Definition: Core.hh:1472
void slotExecuteAfterStartup()
Executed after loading core completly to load files from commandline.
void fullscreen(bool _state)
set fullscreen mode
Definition: Core.cc:1070
int lastWidth_
Slot called everytime the view is updated.
Definition: Core.hh:938
static PythonInterpreter * getInstance()
Creates or returns an instance of the interpreter.
prototypeVec4d vec4dPrototype_
Prototype for the Vector type.
Definition: Core.hh:1354
void slotObjectUpdated(int _identifier, const UpdateType &_type=UPDATE_ALL)
Called by the plugins if they changed something in the object list (deleted, added, or other property changes)
void loadPlugins()
Load all plugins from default plugin directory and from INI-File.
Core()
constructor
Definition: Core.cc:108
LoggerWidget * logWidget_
Textedit at the bottom for log messages.
Definition: CoreWidget.hh:686
void updateRecent()
Update the recent files menu.
Definition: CoreWidget.cc:874
Logtype
Log types for Message Window.
QList< SlotInfo > coreSlots_
Core scripting engine.
Definition: Core.hh:1402
Draw node in second pass.
Definition: BaseNode.hh:445
QFile * logFile_
logfile
Definition: Core.hh:1210
void PluginMouseEventLight(QMouseEvent *)
Emitted when an light event occurs.
void deserializeMaterialProperties(int _objId, QString _props)
Serialize material properties.
Definition: Core.cc:1817
void slotSetSlotDescription(QString _slotName, QString _slotDescription, QStringList _parameters, QStringList _descriptions)
set a description for one of the plugin&#39;s public slots
Definition: Core.cc:1339
void showLogger(OpenFlipper::Options::LoggerState _state)
Change visibility of the logger.
const QStringList SOURCE_OBJECTS("source")
Iterable object range.
prototypeDataType DataTypePrototype_
Prototype for the DataType.
Definition: Core.hh:1357
const QStringList ALL_OBJECTS
Iterable object range.
QScriptValue helpFunction(QScriptContext *context, QScriptEngine *engine)
Function to print help about scripting functions.
Definition: scripting.cc:380
void deleteObject(int _id)
Called to delete an object.
Definition: Core.cc:1788
void setTraverseMode(unsigned int _mode)
Set traverse mode for node.
Definition: BaseNode.hh:452
Predefined datatypes.
Definition: DataTypes.hh:83
void setMaxFrameRate(int _rate)
set the maximal framerate ( automatically enables framerate restriction )
Definition: Core.cc:1034
void slotShowPlugins()
Show Plugins Dialog.
prototypeMatrix4x4 matrix4x4Prototype_
Prototype for the Matrix type.
Definition: Core.hh:1360
void addRecent(QString _filename, DataType _type)
Add a recent file and update menu.
Definition: CoreWidget.cc:860
QScriptValue printToFileFunction(QScriptContext *context, QScriptEngine *engine)
Special print function for sending output to a file.
Definition: scripting.cc:354
void saveSettings()
Save current status to a settings file. Solicit file name through dialog.
Definition: saveSettings.cc:53
void restoreState(QSettings &_settings)
restores the state
int id() const
Definition: BaseObject.cc:190
SideArea * toolBox_
Toolbox.
Definition: CoreWidget.hh:734
void showViewModeControls(bool _show)
Show or Hide the viewmode control widget.
Definition: Core.cc:1077
void log(Logtype _type, QString _message)
Logg with OUT,WARN or ERR as type.
void applyOptions()
after ini-files have been loaded and core is up or if options have been changed -> apply Options ...
BaseObject * childExists(int _objectId)
Check if the element exists in the subtree of this element.
Definition: BaseObject.cc:516
bool dataType(DataType _type) const
Definition: BaseObject.cc:221
void setDataSeparatorNodes(SeparatorNode *_dataSeparatorNode)
Set the internal data root node pointers ( DO NOT USE!! )
void setFullscreen(bool _state)
Enable or disable fullscreen mode.
Definition: CoreWidget.cc:682
BaseObject * next()
Definition: BaseObject.cc:404
QWidget * getToolboxArea()
Show logger in splitter or not.
Definition: CoreWidget.hh:511
int lastHeight_
Slot called everytime the view is updated.
Definition: Core.hh:939
LoggerState
State of the logging widget.
void setViewMode(QString _mode, bool _expandAll=false)
Set the view Mode to the given Mode.
Definition: viewMode.cc:316
QSplashScreen * splash_
SplashScreen, only used in gui mode.
Definition: Core.hh:1599
void deleteSubtree()
delete the whole subtree below this item ( The item itself is not touched )
Definition: BaseObject.cc:582
void updateUI()
process events during script execution to keep the ui alive
Definition: Core.cc:996
void setViewerLayout(int _idx)
Change viewer layout that was selected in the combo box.
Definition: CoreWidget.cc:977
void slotMouseEventIdentify(QMouseEvent *_event)
Handle Mouse events when in Identifier mode.
Definition: Core.cc:773
ACG::SceneGraph::SeparatorNode SeparatorNode
Seperator Node.
CoreWidget * coreWidget_
The main applications widget ( only created in gui mode )
Definition: Core.hh:1596
void resizeViewers(int _width, int _height)
resize the examinerViewer
Definition: Core.cc:1546
void setScriptEngine(QScriptEngine *_engine)
DONT USE! (Function to set the internal reference to the script Engine)
Definition: RPCWrappers.cc:104
void showStatusBar(bool _state)
Show or hide status bar.
Definition: StatusBar.cc:155
QStringList scriptingFunctions_
List of all registered scripting functions.
Definition: Core.hh:1348
void setSceneGraphRootNode(SeparatorNode *_root_node)
void slotMouseEventLight(QMouseEvent *_event)
Handle Mouse events when in Light mode.
Definition: Core.cc:823
virtual void exit()
void slotCall(QString _pluginName, QString _functionName, bool &_success)
Definition: RPC.cc:94
void slotExit()
Exit Application.
Definition: Core.cc:1215
This class provides OpenFlippers Python interpreter.
virtual void slotInformationRequested(const QPoint _clickedPoint, DataType _type)=0
Show information dialog on clicked object.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
pick any of the prior targets (should be implemented for all nodes)
Definition: PickTarget.hh:84
void snapshot(unsigned int _viewerId=0, int _width=0, int _height=0, bool _alpha=false, bool _hideCoordsys=false, int _numSamples=1)
Definition: Core.cc:1500
void slotRegisterSlotKeyBindings()
register scripting slots to allow keyBindings
Definition: keyHandling.cc:283
void slotAddPickMode(const std::string &_mode)
Add a new picking mode to the examiner_widget_.
Definition: Core.cc:925
void applicationSnapshotName(QString _name)
Set the snapshot name.
void saveState(QSettings &_settings)
saves the current state
void applicationSnapshot()
Create a snapshot of the whole app.
void resizeApplication(int _width, int _height)
resize the whole Application
Definition: Core.cc:1557
void snapshotBaseFileName(const QString &_fname)
void slotAddHiddenPickMode(const std::string &_mode)
Add a new and invisible picking mode to the examiner_widget_.
Definition: Core.cc:934
QScriptEngine scriptEngine_
Core scripting engine.
Definition: Core.hh:1342
void loggerState(int _state)
Change the logging window state.
Definition: Core.cc:1085
void exitApplication()
exit the current application
Definition: Core.cc:1058
void slotLog(Logtype _type, QString _message)
Console logger.
Definition: Logging.cc:91
void multiViewMode(int _mode)
Switch the multiView Mode.
Definition: Core.cc:1133
void saveState(QSettings &_settings)
returns the current state
Definition: SideArea.cc:172
void checkScenegraphDirty()
Called to check if the scenegraph needs to be redrawn.
Definition: Core.cc:1013
void slotAddEmptyObjectMenu()
Open the add Empty dialog.
void enableOpenMeshErrorLog(bool _state)
Enable or disable OpenMesh error logging.
Definition: Core.cc:1096
void slotGetDescription(QString _function, QString &_fnDescription, QStringList &_parameters, QStringList &_descriptions)
get available descriptions for a given public slot
Definition: Core.cc:1391
bool checkLibraryVersions()
Checks for library inconsistencies.
Definition: Core.cc:1922
void setupOptions()
Get all ini files and set basic paths and options.
void snapshotCounter(const int _counter)
void snapshotCounterStart(const int _counter, unsigned int _viewerId=0)
Set the start index for the snapshot counter.
Definition: Core.cc:1487
QStringList IteratorRestriction
Iterable object range.
QVector< ViewMode * > viewModes_
List of available draw modes.
Definition: Core.hh:1605
QString icon
Definition: CoreWidget.hh:131
void PluginWheelEvent(QWheelEvent *, const std::string &)
When this Signal is emitted when a Wheel Event occures.
void slotDeleteAllObjects()
Called when a plugin wants to delete all objects.
Definition: Core.cc:1896
void showReducedMenuBar(bool reduced)
typedefs
Definition: MenuBar.cc:147
void addPickMode(const std::string &_name, bool _mouse_tracking=false, int _pos=-1, bool _visible=true, QCursor _cursor=Qt::ArrowCursor)
add pick mode
Definition: picking.cc:392
void viewerSnapshot()
Create a snapshot of the whole app.
const QStringList TARGET_OBJECTS("target")
Iterable object range.
QString name
Name of the View Mode.
Definition: CoreWidget.hh:127
std::vector< glViewer *> examiner_widgets_
Examiner Widget.
Definition: CoreWidget.hh:677
QScriptValue myPrintFunction(QScriptContext *context, QScriptEngine *engine)
Special print function for core logger.
Definition: scripting.cc:336
void showToolbox(bool _state)
Show or hide toolbox.
Definition: CoreWidget.cc:741
MaterialNode * materialNode()
get a pointer to the materialnode
void slotScriptError(const QScriptValue &error)
Core scripting engine.
Definition: scripting.cc:332
ObjectRange objects(IteratorRestriction _restriction, DataType _dataType)
Iterable object range.
void setActiveExaminer(const unsigned int _id)
Set the active id of the examiner which got the last mouse events.
void updateView()
Called when a plugin requests an update in the viewer.
Definition: Core.cc:945
Execute action on node first and then on its children.
Definition: BaseNode.hh:441
Interface class for providing information on objects.
void pluginSceneDrawn()
This signal is emitted after the scene has been drawn.
QtSlideWindow * slidingLogger_
Class that holds the animated log widget.
Definition: CoreWidget.hh:722
void snapshotBaseFileName(QString _fname, unsigned int _viewerId=0)
Definition: Core.cc:1460
QStringList visibleToolboxes
List of Visible Toolboxes in this view mode.
Definition: CoreWidget.hh:137
Class for the handling of simple configuration files.
Definition: INIFile.hh:99
void deletedObject(int _objectId)
This slot is called by the object manager when an object is deleted.
ACG::SceneGraph::MaterialNode * coordsysMaterialNode_
Node for coordsys Material.
Definition: Core.hh:1095
void saveAllObjects()
Slot for saving objects from Menu.
void slotSetSlotDescriptionGlobalFunction(QString _functionName, QString _slotDescription, QStringList _parameters, QStringList _descriptions)
set a description for a global scripting function
Definition: Core.cc:1378
bool connect(const QString &name, const bool create)
Connect INIFile object with given filename.
Definition: INIFile.cc:70
Viewer::ViewerProperties & viewerProperties(int _id)
Get the viewer properties Use this functions to get basic viewer properties such as backgroundcolor o...
void snapshotFileType(const QString &_type)
void applicationSnapshotName(QString _name)
Set the baseName for the application snapshot.
Definition: Core.cc:1519
void showReducedMenuBar(bool reduced)
Core scripting engine.
Definition: Core.cc:2061
void slotLogToFile(Logtype _type, QString _message)
log to file
Definition: Core.cc:1293
ACG::SceneGraph::MaterialNode MaterialNode
Materialnode.
void restoreKeyBindings()
Restore key assignments from configs files.
std::vector< PluginLogger * > loggers_
Logger interfaces between plugins and core logger.
Definition: Core.hh:1586
#define TOSTRING(x)
QSettings object containing all program settings of OpenFlipper.
void slotMouseEvent(QMouseEvent *_event)
Gets called by examiner widget when mouse is moved in picking mode.
Definition: Core.cc:853
void loadObject()
Open Load Widget.
void finishSplash()
exit the current application
Definition: Core.cc:2065
size_t available()
number of available renderers
bool custom
Is this a user defined custom view mode or a plugin generated one.
Definition: CoreWidget.hh:134
std::vector< PluginInfo > & plugins()
Index of Plugins toolbox widget.
Definition: Core.cc:766
ACG::SceneGraph::CoordinateSystemNode CoordsysNode
Simple Name for CoordsysNode.
~Core()
destructor
Definition: Core.cc:748
void blockScenegraphUpdates(bool _block)
Called when a plugin wants to lock or unlock scenegraph updates.
Definition: Core.cc:1002
void scriptLog(QString _message)
Logging signal for ScriptEngine.
bool checkOpenGLCapabilities()
OpenGL capability check.
Definition: Core.cc:1986
void slotScriptInfo(QString _pluginName, QString _functionName)
Core scripting engine.
Definition: scripting.cc:67
void setValue(const QString &key, const QVariant &value)
Wrapper function which makes it possible to enable Debugging output with -DOPENFLIPPER_SETTINGS_DEBUG...
void setViewerProperties(const std::vector< Viewer::ViewerProperties * > &_viewerProperties)
Set the internal viewerProperties pointer ( DO NOT USE!! )
void objectDeleted(int)
Called after an object has been deleted.
DLLEXPORT OpenFlipperQSettings & OpenFlipperSettings()
QSettings object containing all program settings of OpenFlipper.
QString serializeMaterialProperties(int _objId)
Serialize material properties.
Definition: Core.cc:1836
bool getPickedObject(const size_t _node_idx, BaseObjectData *&_object)
Get the picked mesh.
SeparatorNode * core_nodes_
Separator Node holding all core scenegraph nodes.
Definition: Core.hh:1085
void viewerSnapshot()
Take a snapshot from all viewers.
Definition: Core.cc:1525
QSplitter * toolSplitter_
Spliter between toplevel objects and toolbox.
Definition: CoreWidget.hh:731
void clearObjectComment(int objId, QString key)
Called when a plugin requests an update in the viewer.
Definition: Core.cc:1869
void restrictFrameRate(bool _enable)
Enable or disable framerate restriction.
Definition: Core.cc:1028
void init()
Second initialization stage.
Definition: Core.cc:192
void newObject(int _objectId)
This slot is called by the object manager when a new object is created.
void restoreState(QSettings &_settings)
restores the state
Definition: SideArea.cc:184
SeparatorNode * dataSeparatorNode_
Toplevel Nodes for data objects.
Definition: Core.hh:1089
void setObjectComment(int objId, QString key, QString comment)
Called when a plugin requests an update in the viewer.
Definition: Core.cc:1856
QTimer * redrawTimer_
If enabled, this timer will block screen refresh if done more then 30 times per second.
Definition: Core.hh:1608
Interface class from which all plugins have to be created.
void traverse(BaseNode *_node, Action &_action)
Definition: SceneGraph.hh:137
void applicationSnapshot()
Take a snapshot from the whole app.
Definition: Core.cc:1513
ACG::SceneGraph::Material & material()
Get material object reference.
DLLEXPORT DataType typeId(QString _name)
Given a dataType Identifier string this function will return the id of the datatype.
Definition: Types.cc:139
void writeOnExit()
Called if app is closed and writes all information to ini file.
Definition: Core.cc:1178
void PluginMouseEvent(QMouseEvent *)
When this Signal is emitted when a Mouse Event occures.
void writeVersionNumbers(QString _filename)
write the current versions of all plugins to ini file
Definition: Core.cc:1567
void stopVideoCapture()
Stop video capturing.
Definition: Video.cc:109
void setSceneGraphRootNodeGlobal(SeparatorNode *_root_node)
void clearComment(const QString &key)
Get comment for the specified key.
Definition: BaseObject.cc:843