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 // clearing may have caused some queued qt signals to be emitted,
1251 // we must process them before destroying everything:
1252 qApp->processEvents();
1253
1254 // Notify plugins of imminent exit.
1255 for ( uint i = 0 ; i < plugins().size() ; ++i ){
1256 BaseInterface* basePlugin = qobject_cast< BaseInterface * >(plugins()[i].plugin);
1257
1258 // Dont call exit if we cannot get the Plugin
1259 if ( basePlugin )
1260 basePlugin->exit();
1261 }
1262
1263 // Delete Plugins to actually call their destructor
1264 for(PluginInfo p : plugins())
1265 delete p.plugin;
1266
1267 // close the log file to ensure everything is writeen correctly
1268 if (logFile_)
1269 logFile_->close();
1270
1271 // Close the settings file
1272 OpenFlipper::Options::closeSettings();
1273
1274 // Test if ini-file should be cleaned
1275 // If so, delete it...
1276 if(OpenFlipper::Options::deleteIniFile()) {
1277 bool success = true;
1278
1279 // Iterate over all ini files and clear them
1280 QStringList optionFiles = OpenFlipper::Options::optionFiles();
1281 for ( int i = 0 ; i < (int)optionFiles.size(); ++i) {
1282 success &= QFile::remove(optionFiles[i]);
1283 }
1284
1285 if(!success) {
1286 QMessageBox::warning(0, tr("Warning"),
1287 tr("One or more files could not be removed.\nDelete files manually."),
1288 QMessageBox::Ok,
1289 QMessageBox::Ok);
1290 }
1291 }
1292
1293 // Cleanup the widgets here
1294 delete coreWidget_;
1295
1296 qApp->quit();
1297}
1298
1299//-----------------------------------------------------------------------------
1300
1302
1303 // Call clearAll() before closing application
1304 // in order to call all object's destructors...
1305 clearAll();
1306
1307 // Cleanup the widgets here
1308 delete coreWidget_;
1309
1310
1311 //stop qt event loop
1312 //this function does return to the caller
1313 qApp->exit(EXIT_FAILURE);
1314
1315 // Kill application with an error
1316 // No need to clean up here anyway
1317 exit(EXIT_FAILURE);
1318
1319}
1320
1321//-----------------------------------------------------------------------------
1322
1324void Core::slotLogToFile(Logtype _type, QString _message){
1325
1326 if (!OpenFlipperSettings().value("Core/Log/logFileEnabled",true).toBool() )
1327 return;
1328
1329 if (logStream_ == 0){
1330 //check if a logfile has been specified and if the path is valid
1331
1332 QString fileName = OpenFlipperSettings().value("Core/Log/logFile","").toString();
1333 QFileInfo fi( fileName );
1334
1335 if ( fileName == "" || !fi.dir().exists() ) {
1336 OpenFlipperSettings().setValue("Core/Log/logFile", OpenFlipper::Options::configDirStr() + OpenFlipper::Options::dirSeparator() + "OpenFlipper.log");
1337 }
1338
1339 logFile_ = new QFile( OpenFlipperSettings().value("Core/Log/logFile").toString() );
1340 if ( logFile_->open(QFile::WriteOnly) ) {
1341 logStream_ = new QTextStream (logFile_);
1342 } else {
1343 emit log(LOGERR, tr("Unable to open logfile!"));
1344 return;
1345 }
1346 }
1347
1348 switch (_type) {
1349 case LOGINFO:
1350 (*logStream_) << "INFO:"; break;
1351 case LOGOUT:
1352 (*logStream_) << "OUT :"; break;
1353 case LOGWARN:
1354 (*logStream_) << "WARN:"; break;
1355 case LOGERR:
1356 (*logStream_) << "ERR :"; break;
1357 case LOGSTATUS:
1358 (*logStream_) << "STAT:"; break;
1359 }
1360
1361 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
1362 (*logStream_) << _message << "\n" << flush;
1363 #else
1364 (*logStream_) << _message << "\n" << Qt::flush;
1365 #endif
1366
1367}
1368
1370void Core::slotSetSlotDescription(QString _slotName, QString _slotDescription,
1371 QStringList _parameters, QStringList _descriptions)
1372{
1373 //handle core slots
1374 if (sender() == this){
1375 SlotInfo info;
1376 info.slotName = _slotName;
1377 info.slotDescription = _slotDescription;
1378 info.parameters = _parameters;
1379 info.descriptions = _descriptions;
1380
1381 coreSlots_.push_back( info );
1382 return;
1383 }
1384
1385 //handle plugin slots
1386
1387 //find plugin
1388 PluginInfo* pluginInfo = 0;
1389
1390 for (uint i=0; i < plugins().size(); i++)
1391 if (plugins()[i].plugin == sender())
1392 pluginInfo = &plugins()[i];
1393
1394 if (pluginInfo == 0){
1395 emit log(LOGERR, tr("Unable to set slot-description. Plugin not found!"));
1396 return;
1397 }
1398
1399 SlotInfo info;
1400 info.slotName = _slotName;
1401 info.slotDescription = _slotDescription;
1402 info.parameters = _parameters;
1403 info.descriptions = _descriptions;
1404
1405 pluginInfo->slotInfos.append( info );
1406}
1407
1409void Core::slotSetSlotDescriptionGlobalFunction(QString _functionName, QString _slotDescription,
1410 QStringList _parameters, QStringList _descriptions)
1411{
1412 SlotInfo info;
1413 info.slotName = _functionName;
1414 info.slotDescription = _slotDescription;
1415 info.parameters = _parameters;
1416 info.descriptions = _descriptions;
1417
1418 globalFunctions_.push_back( info );
1419}
1420
1422void Core::slotGetDescription(QString _function, QString& _fnDescription,
1423 QStringList& _parameters, QStringList& _descriptions )
1424{
1425 QString pluginName = _function.section(".", 0, 0);
1426 QString slotName = _function.section(".", 1, 1);
1427
1428 // Global function
1429 if ( !_function.contains(".") ) {
1430
1431 // Only one section, so we have to swap
1432 slotName = pluginName;
1433
1434 for (int i=0; i < globalFunctions_.count(); i++) {
1435
1436 if (globalFunctions_[i].slotName == slotName){
1437 _fnDescription = globalFunctions_[i].slotDescription;
1438 _parameters = globalFunctions_[i].parameters;
1439 _descriptions = globalFunctions_[i].descriptions;
1440 return;
1441 }
1442 }
1443 return;
1444 }
1445
1446 //handle core slots
1447 if (pluginName == "core"){
1448
1449 _fnDescription = "";
1450 _parameters.clear();
1451 _descriptions.clear();
1452
1453 for (int i=0; i < coreSlots_.count(); i++)
1454 if (coreSlots_[i].slotName == slotName){
1455 _fnDescription = coreSlots_[i].slotDescription;
1456 _parameters = coreSlots_[i].parameters;
1457 _descriptions = coreSlots_[i].descriptions;
1458 return;
1459 }
1460 return;
1461 }
1462
1463 //handle plugin slots
1464
1465 //find plugin
1466 PluginInfo* pluginInfo = 0;
1467
1468 for (uint i=0; i < plugins().size(); i++)
1469 if (plugins()[i].rpcName == pluginName)
1470 pluginInfo = &plugins()[i];
1471
1472 if (pluginInfo == 0){
1473 emit log(LOGERR, tr("Unable to get slot-description. Plugin not found!"));
1474 return;
1475 }
1476
1477 _fnDescription = "";
1478 _parameters.clear();
1479 _descriptions.clear();
1480
1481 //find slot
1482 for (int i=0; i < pluginInfo->slotInfos.count(); i++)
1483 if (pluginInfo->slotInfos[i].slotName == slotName){
1484 _fnDescription = pluginInfo->slotInfos[i].slotDescription;
1485 _parameters = pluginInfo->slotInfos[i].parameters;
1486 _descriptions = pluginInfo->slotInfos[i].descriptions;
1487 return;
1488 }
1489}
1490
1491void Core::snapshotBaseFileName(QString _fname, unsigned int _viewerId ){
1492
1493 if ( OpenFlipper::Options::gui() ) {
1494 if ( _viewerId >= OpenFlipper::Options::examinerWidgets() ) {
1495 emit log(LOGERR,tr("Unable to snapshotBaseFileName for viewer ") + QString::number(_viewerId) );
1496 return;
1497 }
1498
1500 }
1501
1502}
1503
1504void Core::snapshotFileType(QString _type, unsigned int _viewerId ){
1505
1506 if ( OpenFlipper::Options::gui() ) {
1507 if ( _viewerId >= OpenFlipper::Options::examinerWidgets() ) {
1508 emit log(LOGERR,tr("Unable to snapshotFileType for viewer ") + QString::number(_viewerId) );
1509 return;
1510 }
1511
1513 }
1514
1515}
1516
1517
1518void Core::snapshotCounterStart(const int _counter, unsigned int _viewerId ){
1519
1520 if ( OpenFlipper::Options::gui() ) {
1521 if ( _viewerId >= OpenFlipper::Options::examinerWidgets() ) {
1522 emit log(LOGERR,tr("Unable to snapshotFileType for viewer ") + QString::number(_viewerId) );
1523 return;
1524 }
1525
1527 }
1528
1529}
1530
1531void Core::snapshot( unsigned int _viewerId, int _width, int _height, bool _alpha, bool _hideCoordsys, int _numSamples ){
1532
1533
1534 if ( OpenFlipper::Options::gui() ) {
1535 if ( _viewerId >= OpenFlipper::Options::examinerWidgets() ) {
1536 emit log(LOGERR,tr("Unable to create snapshot for viewer ") + QString::number(_viewerId) );
1537 return;
1538 }
1539 coreWidget_->examiner_widgets_[_viewerId]->snapshot(_width, _height, _alpha, _hideCoordsys, _numSamples);
1540 }
1541
1542}
1543
1545
1546 if ( OpenFlipper::Options::gui() )
1548}
1549
1551
1552 if ( OpenFlipper::Options::gui() )
1554}
1555
1557
1558 if ( OpenFlipper::Options::gui() )
1560}
1561
1562void Core::viewerSnapshot(QString file_name, bool store_comments,
1563 bool comments_visible_only, bool comments_targeted_only,
1564 bool store_material_info, int snapshot_width, int snapshot_height,
1565 bool snapshot_transparent, bool hide_coord_sys,
1566 int snapshot_multisampling, bool store_view) {
1567
1568 if ( OpenFlipper::Options::gui() )
1569 coreWidget_->viewerSnapshot(file_name, store_comments,
1570 comments_visible_only, comments_targeted_only,
1571 store_material_info, snapshot_width, snapshot_height,
1572 snapshot_transparent, hide_coord_sys, snapshot_multisampling,
1573 store_view);
1574}
1575
1576
1577void Core::resizeViewers(int _width, int _height ){
1578 if ( OpenFlipper::Options::gui() ){
1579
1580 lastWidth_ = coreWidget_->glView_->width();
1581 lastHeight_ = coreWidget_->glView_->height();
1582
1583 // offset +6, +6: Verified: resizing with current sizes leads to no effect
1584 coreWidget_->glView_->resize(_width+6, _height+6);
1585 }
1586}
1587
1588void Core::resizeApplication(int _width, int _height ){
1589 if ( OpenFlipper::Options::gui() ){
1590
1591 lastWidth_ = coreWidget_->glView_->width();
1592 lastHeight_ = coreWidget_->glView_->height();
1593
1594 coreWidget_->resize(_width, _height);
1595 }
1596}
1597
1598void Core::writeVersionNumbers(QString _filename){
1599
1600 INIFile ini;
1601
1602 if ( ! ini.connect(_filename,true) ) {
1603 emit log(LOGERR,tr("Failed to connect to _ini file") + _filename);
1604 return;
1605 }
1606
1607 //add coreVersion
1608 if ( OpenFlipper::Options::isWindows() )
1609 ini.add_entry( "Core" , "VersionWindows" , OpenFlipper::Options::coreVersion() );
1610 else
1611 ini.add_entry( "Core" , "VersionLinux" , OpenFlipper::Options::coreVersion() );
1612
1613 //add pluginVersions
1614 for (uint i=0; i < plugins().size(); i++){
1615
1616 if ( OpenFlipper::Options::isWindows() )
1617 ini.add_entry( plugins()[i].name , "VersionWindows" , plugins()[i].version );
1618 else
1619 ini.add_entry( plugins()[i].name , "VersionLinux" , plugins()[i].version );
1620 }
1621
1622 ini.disconnect();
1623}
1624
1625QList<int> Core::objectList (QString _selection, QStringList _types)
1626{
1627 QList<int> rv;
1628 DataType ids = 0;
1630
1631 foreach (QString s, _types)
1632 if (!s.isEmpty ())
1633 ids = typeId (s);
1634
1635 if (_selection == "source")
1637 else if (_selection == "target")
1639
1640 for (auto* o_it : PluginFunctions::objects(selection, ids) )
1641 rv.append (o_it->id ());
1642
1643 return rv;
1644}
1645
1648
1649 connect(this, SIGNAL(setSlotDescription(QString,QString,QStringList,QStringList)),
1650 this, SLOT(slotSetSlotDescription(QString,QString,QStringList,QStringList)) );
1651
1652 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(";")));
1653 emit slotSetSlotDescriptionGlobalFunction("help(QString)", tr("Print help about something"), QStringList("Help Entry"), QStringList("help about what?"));
1654
1655
1656 emit setSlotDescription("deleteObject(int)", tr("Delete an object from the scene."), QStringList("ObjectId"), QStringList(tr("Id of the object to delete")));
1657 emit setSlotDescription("updateView()", tr("Redraw the contents of the viewer."), QStringList(), QStringList());
1658 emit setSlotDescription("clearAll()", tr("Clear all data objects."), QStringList(), QStringList());
1659 emit setSlotDescription("exitApplication()", tr("Quit OpenFlipper"), QStringList(), QStringList());
1660 emit setSlotDescription("fullscreen(bool)", tr("Enable or disable fullscreen mode"),
1661 QStringList(tr("enabled")) ,
1662 QStringList(tr("Enable or disable fullscreen mode")));
1663 emit setSlotDescription("showViewModeControls(bool)", tr("Show or hide the view mode control box"),
1664 QStringList(tr("Show?")) ,
1665 QStringList());
1666 emit setSlotDescription("loggerState(int)", tr("Change the logger window state"), QStringList(tr("Change the logger window state")), QStringList());
1667 emit setSlotDescription("enableOpenMeshErrorLog(bool)", tr("Enable or disable OpenMesh error logging"), QStringList(tr("OpenMesh error logging enabled")), QStringList());
1668 emit setSlotDescription("showToolbox(bool)", tr("Show or hide toolbox"), QStringList(tr("Show or hide the toolbox")), QStringList());
1669 emit setSlotDescription("showStatusBar(bool)", tr("Show or hide status bar"), QStringList(tr("Show or hide the status bar")), QStringList());
1670 emit setSlotDescription("multiViewMode(int)", tr("Switch MultiView Mode"),
1671 QStringList(tr("Mode")), QStringList(tr("0: One Viewer\n1: Double Viewer\n2: Grid \n3: Horizontal split ")));
1672
1673 emit setSlotDescription("restrictFrameRate(bool)", tr("Restrict FrameRate to MaxFrameRate"),
1674 QStringList(tr("enabled")), QStringList(tr("restriction switch")));
1675 emit setSlotDescription("setMaxFrameRate(int)", tr("set the maximal framerate (automatically enables framerate restriction)"),
1676 QStringList(tr("frameRate")), QStringList(tr("Maximum frameRate")));
1677 emit setSlotDescription("snapshotBaseFileName(QString)", tr("Set a filename for storing snapshots.")
1678 , QStringList(), QStringList());
1679 emit setSlotDescription("snapshotFileType(QString)", tr("Set a filetype for storing snapshots.")
1680 , QStringList(), QStringList());
1681 emit setSlotDescription("snapshotCounterStart(int)", tr("Set the starting number for the snapshot counter.")
1682 , QStringList("StartValue"), QStringList("Starting number for the counter"));
1683 emit setSlotDescription("snapshot()", tr("Make a snapshot of the viewer. If no filename"
1684 " was set using snapshotBaseFileName() the snapshot is stored"
1685 " in snap.png in the current directory. The captured image will have "
1686 " the same dimensions as the current viewport. "
1687 "For every snapshot a counter is added to the filename."), QStringList(), QStringList());
1688 emit setSlotDescription("snapshot(uint)", tr("Make a snapshot of the viewer with id viewerId. If no filename"
1689 " was set using snapshotBaseFileName() the snapshot is stored"
1690 " in snap.png in the current directory. For every snapshot"
1691 " a counter is added to the filename."), QStringList("viewerId"), QStringList("Id of viewer to be captured (default is 0)"));
1692 emit setSlotDescription("snapshot(uint,int,int)", tr("Make a snapshot of the viewer with id viewerId."
1693 " Pass 0 as viewerId parameter to capture the current viewer. "
1694 " The captured image will have the specified dimensions. "
1695 " If 0 is passed as either width or height parameter, the value will "
1696 " automatically be set to hold the right aspect ratio, respectively. "
1697 " If no filename was set using snapshotBaseFileName() the snapshot is stored"
1698 " in snap.png in the current directory. For every snapshot"
1699 " a counter is added to the filename."), QStringList(QString("viewerId;width;height").split(";")),
1700 QStringList(QString("Id of viewer (default is 0);Width of image;Height of image").split(";")));
1701 emit setSlotDescription("snapshot(uint,int,int,bool)", tr("Make a snapshot of the viewer with id viewerId."
1702 " Pass 0 as viewerId parameter to capture the current viewer. "
1703 " The captured image will have the specified dimensions. "
1704 " If 0 is passed as either width or height parameter, the value will "
1705 " automatically be set to hold the right aspect ratio, respectively. "
1706 " If 0 is passed for both width and height values, the viewport's current "
1707 " dimension is used. Set alpha to true if you want the background to be transparent. "
1708 " If no filename was set using snapshotBaseFileName() the snapshot is stored"
1709 " in snap.png in the current directory. For every snapshot"
1710 " a counter is added to the filename."), QStringList(QString("viewerId;width;height;alpha").split(";")),
1711 QStringList(QString("Id of viewer (default is 0);Width of image;Height of image;Transparent background").split(";")));
1712 emit setSlotDescription("snapshot(uint,int,int,bool,bool)", tr("Make a snapshot of the viewer with id viewerId."
1713 " Pass 0 as viewerId parameter to capture the current viewer. "
1714 " The captured image will have the specified dimensions. "
1715 " If 0 is passed as either width or height parameter, the value will "
1716 " automatically be set to hold the right aspect ratio, respectively. "
1717 " If 0 is passed for both width and height values, the viewport's current "
1718 " dimension is used. Set alpha to true if you want the background to be transparent. "
1719 " The fifth parameter is used to hide the coordinate system in the upper right corner of the screen. "
1720 " If no filename was set using snapshotBaseFileName() the snapshot is stored"
1721 " in snap.png in the current directory. For every snapshot"
1722 " a counter is added to the filename."), QStringList(QString("viewerId;width;height;alpha;hideCoordsys").split(";")),
1723 QStringList(QString("Id of viewer (default is 0);Width of image;Height of image;Transparent background;Hide coordsys node").split(";")));
1724 emit setSlotDescription("snapshot(uint,int,int,bool,bool,int)", tr("Make a snapshot of the viewer with id viewerId."
1725 " Pass 0 as viewerId parameter to capture the current viewer. "
1726 " The captured image will have the specified dimensions. "
1727 " If 0 is passed as either width or height parameter, the value will "
1728 " automatically be set to hold the right aspect ratio, respectively. "
1729 " If 0 is passed for both width and height values, the viewport's current "
1730 " dimension is used. Set alpha to true if you want the background to be transparent. "
1731 " The fifth parameter is used to hide the coordinate system in the upper right corner of the screen. "
1732 " If no filename was set using snapshotBaseFileName() the snapshot is stored"
1733 " in snap.png in the current directory. For every snapshot"
1734 " a counter is added to the filename."), QStringList(QString("viewerId;width;height;alpha;hideCoordsys;numSamples").split(";")),
1735 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(";")));
1736 emit setSlotDescription("resizeViewer(int,int)", tr("Resize the viewer"),
1737 QString(tr("width,height")).split(","),
1738 QString(tr("new width for the viewer,new height for the viewer")).split(","));
1739 emit setSlotDescription("writeVersionNumbers(QString)", tr("write the current versions of all plugins to INI file"),
1740 QStringList(tr("filename")),
1741 QStringList(tr("fullpath to a file where the versions should be written to.")));
1742 //save slots
1743 emit setSlotDescription("saveObject(int,QString)", tr("Save object to file. If the file exists it will be overwritten."),
1744 QString(tr("object-id,filename")).split(","),
1745 QString(tr("id of the object, complete path and filename")).split(","));
1746 emit setSlotDescription("saveObjectTo(int,QString)", tr("Save object to file. The location can be chosen in a dialog. "
1747 "(only works if GUI is available)"),
1748 QString(tr("object-id,filename")).split(","),
1749 QString(tr("id of the object, initial filename for the dialog")).split(","));
1750 emit setSlotDescription("saveAllObjects()", tr("Saves all target objects. "
1751 "If no filename is available a dialog is shown. (only works if GUI is available)"),QStringList(), QStringList());
1752 emit setSlotDescription("saveAllObjectsTo()", tr("Saves all target objects. The locations can be chosen in dialogs. "
1753 "(only works if GUI is available)"),QStringList(), QStringList());
1754 emit setSlotDescription("saveSettings()", tr("Show the dialog to save the current setting. (only works if GUI is available)"),QStringList(), QStringList());
1755 emit setSlotDescription("saveSettings(QString, bool, bool, bool, bool, bool, bool)", tr("Save the current setting to the supplied file."),
1756 QStringList(tr("filePath,is_saveObjectInfo,is_targetOnly,is_saveAll,is_askOverwrite,is_saveProgramSettings,is_savePluginSettings").split(",")),
1757 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(";")));
1758 //load slots
1759 emit setSlotDescription("loadObject()", tr("Show the dialog to load an object. (only works if GUI is available)"),QStringList(), QStringList());
1760 emit setSlotDescription("loadObject(QString)", tr("Load an object specified in file filename. This automatically determines which file plugin to use."),
1761 QStringList(tr("filename")), QStringList(tr("Filename")));
1762 emit setSlotDescription("getObjectId(QString)", tr("Return identifier of object with specified name. Returns -1 if object was not found."),QStringList(), QStringList());
1763 emit setSlotDescription("loadSettings()", tr("Show the dialog to load settings. (only works if GUI is available)"),QStringList(), QStringList());
1764 emit setSlotDescription("loadSettings(QString)", tr("load settings from file."),QStringList(), QStringList());
1765
1766 emit setSlotDescription("createWidget(QString,QString)", tr("Create a widget from an ui file"),
1767 QString(tr("Object name,ui file")).split(","),
1768 QString(tr("Name of the new widget in script,ui file to load")).split(","));
1769
1770 emit setSlotDescription("addToolbox(QString,QWidget*)", tr("Add a widget as a toolbox"),
1771 QString(tr("Toolbox Entry name,Widget")).split(","),
1772 QString(tr("Name of the new widget in the toolbox,Pointer to the new widget")).split(","));
1773
1774 emit setSlotDescription("addToolbox(QString,QWidget*,QIcon*)", tr("Add a widget as a toolbox"),
1775 QString(tr("Toolbox Entry name,Widget,Icon")).split(","),
1776 QString(tr("Name of the new widget in the toolbox,Pointer to the new widget,Pointer to icon")).split(","));
1777
1778 emit setSlotDescription("serializeMaterialProperties(int)", tr("Serialize and return the material properties of the supplied object."),
1779 QString(tr("ObjectId")).split(","),
1780 QString(tr("ID of the object")).split(","));
1781
1782 emit setSlotDescription("deserializeMaterialProperties(int, QString)", tr("Deserialize the supplied material properties into the supplied object."),
1783 QString(tr("ObjectId, SerializedProps")).split(","),
1784 QString(tr("ID of the object,The serialized material properties.")).split(","));
1785
1786 emit setSlotDescription("addViewModeToolboxes(QString,QString)", tr("Set toolboxes for a viewmode (This automatically adds the view mode if it does not exist)"),
1787 QString(tr("Name,Toolbox List")).split(","),
1788 QString(tr("Name of the Viewmode,seperated list of toolboxes visible in this viewmode")).split(","));
1789
1790 emit setSlotDescription("addViewModeToolbars(QString,QString)", tr("Set toolbars for a viewmode (This automatically adds the view mode if it does not exist)"),
1791 QString(tr("Name,Toolbar List")).split(","),
1792 QString(tr("Name of the Viewmode,seperated list of toolbars visible in this viewmode")).split(","));
1793
1794 emit setSlotDescription("addViewModeContextMenus(QString,QString)", tr("Set context Menus for a viewmode (This automatically adds the view mode if it does not exist)"),
1795 QString(tr("Name,Context Menu List")).split(","),
1796 QString(tr("Name of the Viewmode,seperated list of Context Menus visible in this viewmode")).split(","));
1797
1798 emit setSlotDescription("addViewModeIcon(QString,QString)", tr("Set Icon for a viewmode (This automatically adds the view mode if it does not exist)"),
1799 QString(tr("Name,Icon filename")).split(","),
1800 QString(tr("Name of the Viewmode,filename of the icon (will be taken from OpenFlippers icon directory)")).split(","));
1801
1802 emit setSlotDescription("objectList(QString,QStringList)", tr("Returns object list"),
1803 QString(tr("Selection type,Object types")).split(","),
1804 QString(tr("Type of object selection (all,source,target),Object type (All,PolyMesh,TriangleMesh,...)")).split(";"));
1805
1806 emit setSlotDescription("setToolBoxSide(QString)", tr("Determine whether the toolboxes should be displayed on the right or on the left side."),
1807 QStringList(tr("side")), QStringList(tr("The desired side of the toolboxes (either 'left' or 'right')")));
1808
1809 emit setSlotDescription("getToolbox(QString,QString)", tr("Returns a pointer to the requested toolbox widget if it was found, nullptr, otherwise."),
1810 tr("Plugin Name\rToolbox Name").split("\r"),
1811 tr("The plugin which the requested toolbox belongs to.\rThe name of the requested toolbox.").split("\r"));
1812
1813 emit setSlotDescription("blockSceneGraphUpdates()", tr("Disable Scenegraph Updates (e.g. before loading or adding a large number of files)"),QStringList(), QStringList());
1814 emit setSlotDescription("unblockSceneGraphUpdates()", tr("Enable Scenegraph Updates (e.g. before loading or adding a large number of files)"),QStringList(), QStringList());
1815 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.)")));
1816
1817}
1818
1819void Core::deleteObject( int _id ){
1820
1821 if ( _id == -1 )
1822 return;
1823
1824 // get the node
1825 BaseObject* object = objectRoot_->childExists(_id);
1826
1827 if ( !object || object == objectRoot_ ) {
1828 std::cerr << "Error while deleting object, does not exist!!" << std::endl;
1829 return;
1830 }
1831
1832 emit objectDeleted(_id);
1833
1834 // remove the whole subtree below this item
1835 object->deleteSubtree();
1836
1837 // remove the item itself from the parent
1838 object->parent()->removeChild(object);
1839
1840 // delete it
1841 delete object;
1842
1843 // ensure updating the picking buffer
1844 updateView();
1845
1846}
1847
1848void Core::deserializeMaterialProperties(int _objId, QString _props) {
1849 if ( _objId == -1 ) return;
1850
1851 BaseObject* object = objectRoot_->childExists(_objId);
1852
1853 if (!object || object == objectRoot_) {
1854 std::cerr << "No such object." << std::endl;
1855 return;
1856 }
1857
1858 BaseObjectData* o = dynamic_cast<BaseObjectData *>(object);
1859 if (!o || !o->materialNode()) {
1860 std::cerr << "No suitable object found." << std::endl;
1861 return;
1862 }
1863
1864 o->materialNode()->material().deserializeFromJson(_props);
1865}
1866
1868 if ( _objId == -1 ) return QString();
1869
1870 BaseObject* object = objectRoot_->childExists(_objId);
1871
1872 if (!object || object == objectRoot_) {
1873 std::cerr << "No such object." << std::endl;
1874 return QString();
1875 }
1876
1877 BaseObjectData* o = dynamic_cast<BaseObjectData *>(object);
1878 if (!o || !o->materialNode()) {
1879 std::cerr << "No suitable object found." << std::endl;
1880 return QString();
1881 }
1882
1883 return o->materialNode()->material().serializeToJson();
1884}
1885
1886
1887void Core::setObjectComment(int _id, QString key, QString comment) {
1888 if ( _id == -1 ) return;
1889
1890 BaseObject* object = objectRoot_->childExists(_id);
1891
1892 if (!object || object == objectRoot_) {
1893 std::cerr << "No such object." << std::endl;
1894 return;
1895 }
1896
1897 object->getCommentByKey(key) = comment;
1898}
1899
1900void Core::clearObjectComment(int _id, QString key) {
1901 if ( _id == -1 ) return;
1902
1903 BaseObject* object = objectRoot_->childExists(_id);
1904
1905 if (!object || object == objectRoot_) {
1906 std::cerr << "No such object." << std::endl;
1907 return;
1908 }
1909
1910 object->clearComment(key);
1911}
1912
1914 if ( _id == -1 ) return;
1915
1916 BaseObject* object = objectRoot_->childExists(_id);
1917
1918 if (!object || object == objectRoot_) {
1919 std::cerr << "No such object." << std::endl;
1920 return;
1921 }
1922
1923 object->clearAllComments();
1924}
1925
1926
1928
1929 // Remember ids
1930 std::vector< int > ids;
1931
1932 BaseObject* current = objectRoot_->next();
1933
1934 while( current != objectRoot_ ){
1935 ids.push_back( current->id() );
1936 current = current->next();
1937 }
1938
1939 for ( uint i = 0 ; i < ids.size(); ++i ) {
1940 emit objectDeleted(ids[i]);
1941 }
1942
1943 // remove the whole subtree below the root
1945
1947
1948 emit allCleared();
1949}
1950
1951//-----------------------------------------------------------------------------
1952
1954
1955// bool ok = true;
1956// bool warn = false;
1957
1958 QString messages;
1959
1960 QString qtCompiledVersion = QString( QT_VERSION_STR );
1961 QString qtCurrentVersion = qVersion();
1962
1963 if ( qtCompiledVersion != qtCurrentVersion ) {
1964 messages += tr("QT Library Version mismatch!\n");
1965
1966 messages += tr("Currently used QT Version:\t") + qVersion() + "\n";
1967 messages += tr("Link time QT Version:\t\t") + QString( QT_VERSION_STR ) + "\n";
1968 messages += tr("This inconsistency may lead to an unstable behavior of OpenFlipper!");
1969
1970// warn = true;
1971 }
1972
1973// if ( !ok ) {
1974// QString message = tr("Error! Library tests failed!\n");
1975// message += tr("The following problems have been found:\n\n");
1976//
1977// message += messages;
1978//
1979// std::cerr << message.toStdString() << std::endl;
1980//
1981// if ( OpenFlipper::Options::gui() ) {
1982// finishSplash();
1983// StaysOnTopMessageBox::critical ( 0, tr( "Library incompatibilities found!"),message );
1984// }
1985//
1986// // Unsafe operation, so quit the application
1987// exitFailure();
1988//
1989// } else if ( warn ) {
1990
1991// QString message = tr("Warning! The OpenGL capabilities of your current machine/driver could be insufficient!\n\n");
1992// message += tr("The following checks failed:\n\n");
1993// message += messages;
1994//
1995// std::cerr << message.toStdString() << std::endl;
1996//
1997// if ( OpenFlipper::Options::gui() ) {
1998// finishSplash();
1999// StaysOnTopMessageBox::warning ( 0, tr( "Library incompatibilities found!"),message );
2000// }
2001//
2002// }
2003
2004 #ifndef NDEBUG
2005 else {
2006 std::cerr << "Library Check succeeded" << std::endl;
2007 return true;
2008 }
2009 #endif
2010
2011 return true;
2012}
2013
2014//-----------------------------------------------------------------------------
2015
2016
2018
2019 // No gui->no OpenGL
2020 if ( OpenFlipper::Options::nogui() )
2021 return true;
2022
2023 // Status ok?
2024 bool ok = true;
2025 bool warn = false;
2026
2027 QString missing;
2028
2029 QOpenGLContext* context = QOpenGLContext::currentContext();
2030 if ( context ) {
2031
2032 // Get version and check
2033 QSurfaceFormat format = context->format();
2034
2035 if ( (format.majorVersion() < 2) ) {
2036
2037 ok = false;
2038 missing += tr("OpenGL Version less then 2.0!\n");
2039
2040 }
2041
2042 } else {
2043 ok = false;
2044 missing += tr("No OpenGL support found!\n");
2045 }
2046
2047
2048 if ( !ok ) {
2049 QString message = tr("Error! \nThe OpenGL capabilities of your current machine/driver are not sufficient!\n\n");
2050 message += tr("The following checks failed:\n\n");
2051 message += missing;
2052 message += tr("\n\nPlease update your driver or graphics card.\n");
2053 #ifdef APPLE
2054 message += tr("If you have more than one GPU (e.g. MacBook) don't use the internal one!\n");
2055 #endif
2056
2057 std::cerr << message.toStdString() << std::endl;
2058
2059
2060 finishSplash();
2061 QMessageBox::StandardButton button = StaysOnTopMessageBox::critical ( 0, tr( "Insufficient OpenGL Capabilities!"),message,QMessageBox::Abort|QMessageBox::Ignore , QMessageBox::Abort);
2062
2063 // Unsafe operation, so quit the application
2064 if ( button == QMessageBox::Abort )
2065 exitFailure();
2066 else {
2067 StaysOnTopMessageBox::warning(0,tr( "Insufficient OpenGL Capabilities!"),tr("Ignoring OpenGL capabilities might lead to unstable Operation! Do it at your own risk!"));
2068 }
2069
2070
2071
2072 } else if ( warn ) {
2073 finishSplash();
2074 QString message = tr("Warning! Automatic system environment checks discovered some possible problems!\n\n");
2075 message += tr("The following checks failed:\n\n");
2076 message += missing;
2077
2078 std::cerr << message.toStdString() << std::endl;
2079
2080 StaysOnTopMessageBox::warning ( 0, tr( "Detected possible problems!"),message );
2081
2082 }
2083 #ifndef NDEBUG
2084 else {
2085 std::cerr << "OpenGL Version Check succeeded" << std::endl;
2086 }
2087 #endif
2088
2089 return ok;
2090}
2091
2092void Core::showReducedMenuBar(bool reduced) {
2094}
2095
2097 if (splash_) {
2098 splash_->finish(coreWidget_);
2099 splash_->deleteLater();
2100 splash_ = 0;
2101 }
2102}
2103
2104
2105//=============================================================================
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:1647
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:1491
void resizeApplication(int _width, int _height)
resize the whole Application
Definition Core.cc:1588
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:1577
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:1913
void deserializeMaterialProperties(int _objId, QString _props)
Serialize material properties.
Definition Core.cc:1848
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:1422
void showReducedMenuBar(bool reduced)
Core scripting engine.
Definition Core.cc:2092
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:1301
void snapshotFileType(QString _type, unsigned int _viewerId=0)
Set the file type for snapshots.
Definition Core.cc:1504
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:1324
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:1927
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:1518
void slotSetSlotDescriptionGlobalFunction(QString _functionName, QString _slotDescription, QStringList _parameters, QStringList _descriptions)
set a description for a global scripting function
Definition Core.cc:1409
void slotSetSlotDescription(QString _slotName, QString _slotDescription, QStringList _parameters, QStringList _descriptions)
set a description for one of the plugin's public slots
Definition Core.cc:1370
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:2096
void snapshot(unsigned int _viewerId=0, int _width=0, int _height=0, bool _alpha=false, bool _hideCoordsys=false, int _numSamples=1)
Definition Core.cc:1531
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:1550
QScriptEngine scriptEngine_
Core scripting engine.
Definition Core.hh:1344
void deleteObject(int _id)
Called to delete an object.
Definition Core.cc:1819
void slotScriptInfo(const QString &_pluginName, const QString &_functionName)
Core scripting engine.
Definition scripting.cc:67
bool checkLibraryVersions()
Checks for library inconsistencies.
Definition Core.cc:1953
void writeVersionNumbers(QString _filename)
write the current versions of all plugins to ini file
Definition Core.cc:1598
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:1556
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:1544
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:1900
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:1867
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:1625
void setObjectComment(int objId, QString key, QString comment)
Called when a plugin requests an update in the viewer.
Definition Core.cc:1887
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:2017
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