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