// PARAVIS : ParaView wrapper SALOME module
//
-// Copyright (C) 2010-2014 CEA/DEN, EDF R&D
+// Copyright (C) 2010-2015 CEA/DEN, EDF R&D
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
#include <vtkPython.h> // Python first
#include "PVGUI_Module.h"
-#ifdef PARAVIS_WITH_FULL_CORBA
-# include "PARAVIS_Gen_i.hh"
-#endif
-
#include CORBA_SERVER_HEADER(SALOME_ModuleCatalog)
#include CORBA_SERVER_HEADER(SALOMEDS)
#include <pqApplicationCore.h>
#include <pqPVApplicationCore.h>
-#include <pqActiveView.h>
#include <pqObjectBuilder.h>
#include <pqOptions.h>
#include <pqSettings.h>
#include <pqScalarBarVisibilityReaction.h>
#include <pqServerResource.h>
#include <pqServerConnectReaction.h>
-
-// TO REMOVE:
-#include <PyInterp_Interp.h>
-
-#include <PVViewer_EngineWrapper.h>
-
+#include <pqPluginManager.h>
+#include <pqVCRToolbar.h>
+#include <pqAnimationScene.h>
+#include <pqServerManagerModel.h>
+#include <pqAnimationTimeToolbar.h>
//----------------------------------------------------------------------------
PVGUI_Module* ParavisModule = 0;
-PARAVIS_ORB::PARAVIS_Gen_var PVGUI_Module::MyEngine;
+PVSERVER_ORB::PVSERVER_Gen_var PVGUI_Module::MyEngine;
/*!
\mainpage
+ This is the doxygen documentation of the ParaVis module.
+ If you are looking for general information about the structure of the module, you should
+ take a look at the <a href="../index.html">Sphinx documentation</a> first.
- <h2>Building and installing PARAVIS</h2>
- As any other SALOME module, PARAVIS requires PARAVIS_ROOT_DIR environment variable to be set to PARAVIS
- installation directory.
- Other variables needed for correct detection of ParaView location:
- \li PVHOME - points at the ParaView installation directory tree
- \li PVVERSION - number of ParaView version
-
- It also requires common SALOME environment including GUI_ROOT_DIR and other prerequsites.
-
-
- PARAVIS module can be launched using the following commands:
- \li Full SALOME configuration
- \code
- runSalome --modules="PARAVIS"
- \endcode
-
- <h2>ParaView GUI integration</h2>
- <h3>ParaView GUI integration overview</h3>
-
- The main idea is to reuse ParaView GUI internal logic as much as possible, providing a layer
- between it and SALOME GUI that hides the following SALOME GUI implementation details from ParaView:
-
- \li SALOME GUI executable and Qt event loop
- \li SALOME GUI desktop
- \li Dock windows areas
- \li SALOME menu and toolbar managers
-
- Major part of the integration is implemented in PVGUI_Module class.
-
- <h3>ParaView client initalization</h3>
-
- ParaView client initalization is performed when an instance of PVGUI_Module class has been created
- and \link PVGUI_Module::initialize() PVGUI_Module::initialize()\endlink method is called by SALOME GUI.
- The actual client start-up is done in \link PVGUI_Module::pvInit() PVGUI_Module::pvInit()\endlink method.
-
-
- <h3>Multi-view manager</h3>
-
- SALOME GUI requires that each kind of view be implemnted with help of (at least) three classes. For ParaView multi-view manager
- these are:
-
- \li PVGUI_ViewManager - view manager class
- \li PVGUI_Viewer - view model class
- \li PVGUI_ViewWindow - view window class that acts as a parent for %pqViewManager
-
- Single instances of PVGUI_ViewManager and PVGUI_ViewWindow classes are created by \link PVGUI_Module::showView()
- PVGUI_Module::showView()\endlink method upon the first PARAVIS module activation. The same method hides the multi-view manager
- when the module is deactivated (the user switches to another module or a study is closed).
- A special trick is used to make PVGUI_ViewWindow the parent of %pqViewManager widget. It is created initally by %pqMainWindowCore
- with the desktop as a parent, so when it is shown PVGUI_ViewWindow instance is passed to its setParent() method. In
- \link PVGUI_ViewWindow::~PVGUI_ViewWindow() PVGUI_ViewWindow::~PVGUI_ViewWindow()\endlink the parent is nullified to avoid deletion
- of %pqViewManager widget that would break %pqMainWindowCore class.
-
- <h3>ParaView plugins</h3>
- ParaView server and client plugins are managed by %pqMainWindowCore slots that has full access to PARAVIS menus and toolbars.
- As a result they appears automatically in PARAVIS menus and toolbars if loaded successfully.
+ The integration of ParaView into SALOME is split in two parts:
+ \li the PVViewer in the GUI module (folder *src/PVViewer*)
+ \li the ParaVis module itself (the pages you are currently browsing)
*/
/*!
SALOME module wrapping ParaView GUI.
*/
-//_PTR(SComponent)
-//ClientFindOrCreateParavisComponent(_PTR(Study) theStudyDocument)
-//{
-// _PTR(SComponent) aSComponent = theStudyDocument->FindComponent("PARAVIS");
-// if (!aSComponent) {
-// _PTR(StudyBuilder) aStudyBuilder = theStudyDocument->NewBuilder();
-// aStudyBuilder->NewCommand();
-// int aLocked = theStudyDocument->GetProperties()->IsLocked();
-// if (aLocked) theStudyDocument->GetProperties()->SetLocked(false);
-// aSComponent = aStudyBuilder->NewComponent("PARAVIS");
-// _PTR(GenericAttribute) anAttr =
-// aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeName");
-// _PTR(AttributeName) aName (anAttr);
-//
-// ORB_INIT& init = *SINGLETON_<ORB_INIT>::Instance();
-// CORBA::ORB_var anORB = init( qApp->argc(), qApp->argv() );
-//
-// SALOME_NamingService *NamingService = new SALOME_NamingService( anORB );
-// CORBA::Object_var objVarN = NamingService->Resolve("/Kernel/ModulCatalog");
-// SALOME_ModuleCatalog::ModuleCatalog_var Catalogue =
-// SALOME_ModuleCatalog::ModuleCatalog::_narrow(objVarN);
-// SALOME_ModuleCatalog::Acomponent_var Comp = Catalogue->GetComponent( "PARAVIS" );
-// if (!Comp->_is_nil()) {
-// aName->SetValue(Comp->componentusername());
-// }
-//
-// anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributePixMap");
-// _PTR(AttributePixMap) aPixmap (anAttr);
-// aPixmap->SetPixMap( "pqAppIcon16.png" );
-//
-// // Create Attribute parameters for future using
-// anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeParameter");
-//
-// aStudyBuilder->DefineComponentInstance(aSComponent, PVGUI_Module::GetCPPEngine()->GetIOR());
-// if (aLocked) theStudyDocument->GetProperties()->SetLocked(true);
-// aStudyBuilder->CommitCommand();
-// }
-// return aSComponent;
-//}
+_PTR(SComponent)
+ClientFindOrCreateParavisComponent(_PTR(Study) theStudyDocument)
+{
+ _PTR(SComponent) aSComponent = theStudyDocument->FindComponent("PVSERVER");
+ if (!aSComponent) {
+ _PTR(StudyBuilder) aStudyBuilder = theStudyDocument->NewBuilder();
+ aStudyBuilder->NewCommand();
+ int aLocked = theStudyDocument->GetProperties()->IsLocked();
+ if (aLocked) theStudyDocument->GetProperties()->SetLocked(false);
+ aSComponent = aStudyBuilder->NewComponent("PVSERVER");
+ _PTR(GenericAttribute) anAttr =
+ aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeName");
+ _PTR(AttributeName) aName (anAttr);
+
+ ORB_INIT& init = *SINGLETON_<ORB_INIT>::Instance();
+ CORBA::ORB_var anORB = init( qApp->argc(), qApp->argv() );
+
+ SALOME_NamingService *NamingService = new SALOME_NamingService( anORB );
+ CORBA::Object_var objVarN = NamingService->Resolve("/Kernel/ModulCatalog");
+ SALOME_ModuleCatalog::ModuleCatalog_var Catalogue =
+ SALOME_ModuleCatalog::ModuleCatalog::_narrow(objVarN);
+ SALOME_ModuleCatalog::Acomponent_var Comp = Catalogue->GetComponent( "PVSERVER" );
+ if (!Comp->_is_nil()) {
+ aName->SetValue(Comp->componentusername());
+ }
+
+ anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributePixMap");
+ _PTR(AttributePixMap) aPixmap (anAttr);
+ aPixmap->SetPixMap( "pqAppIcon16.png" );
+
+ // Create Attribute parameters for future using
+ anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeParameter");
+
+ aStudyBuilder->DefineComponentInstance(aSComponent, PVGUI_Module::GetCPPEngine()->GetIOR());
+ if (aLocked) theStudyDocument->GetProperties()->SetLocked(true);
+ aStudyBuilder->CommitCommand();
+ }
+ return aSComponent;
+}
/*!
- Clean up function; used to stop ParaView progress events when
+ \brief Clean up function
+
+ Used to stop ParaView progress events when
exception is caught by global exception handler.
*/
void paravisCleanUp()
delete myInitTimer;
}
+/*!
+ * \brief Retrieve the PVSERVER CORBA engine.
+ * This uses the Python wrapper provided
+ * by the PVViewer code in GUI (class PVViewer_EngineWrapper).
+ * \sa GetCPPEngine()
+ */
PVViewer_EngineWrapper * PVGUI_Module::GetEngine()
{
return PVViewer_EngineWrapper::GetInstance();
}
+/*!
+ * \brief Retrieve the PVSERVER CORBA engine.
+ * Uses directly the standard Salome C++ mechanisms
+ * (LifeCycleCorba).
+ * \sa GetEngine()
+ */
+PVSERVER_ORB::PVSERVER_Gen_var PVGUI_Module::GetCPPEngine()
+{
+ // initialize PARAVIS module engine (load, if necessary)
+ if ( CORBA::is_nil( MyEngine ) ) {
+ Engines::EngineComponent_var comp =
+ SalomeApp_Application::lcc()->FindOrLoad_Component( "FactoryServer", "PVSERVER" );
+ MyEngine = PVSERVER_ORB::PVSERVER_Gen::_narrow( comp );
+ }
+ return MyEngine;
+}
/*!
\brief Create data model.
return new PVGUI_DataModel( this );
}
+/*!
+ * \brief Get the ParaView application singleton.
+ */
pqPVApplicationCore * PVGUI_Module::GetPVApplication()
{
return PVViewer_ViewManager::GetPVApplication();
{
LightApp_Module::initialize( app );
- // Create ParaViS actions
createActions();
- // Create ParaViS menus
createMenus();
// Uncomment to debug ParaView initialization
LightApp_Application* anApp = getApp();
SUIT_Desktop* aDesktop = anApp->desktop();
+ // Remember current state of desktop toolbars
+ QList<QToolBar*> foreignToolbars = aDesktop->findChildren<QToolBar*>();
+
// Initialize ParaView client and associated behaviors
// and connect to externally launched pvserver
PVViewer_ViewManager::ParaviewInitApp(aDesktop, anApp->logWindow());
myGuiElements = PVViewer_GUIElements::GetInstance(aDesktop);
- // Remember current state of desktop toolbars
- QList<QToolBar*> foreignToolbars = aDesktop->findChildren<QToolBar*>();
-
+ // [ABN]: careful with the order of the GUI element creation, the loading of the configuration
+ // and the connection to the server. This order is very sensitive if one wants to make
+ // sure all menus, etc ... are correctly populated.
+ // Reference points are: ParaViewMainWindow.cxx and branded_paraview_initializer.cxx.in
setupDockWidgets();
- // Behaviors and connection must be instanciated *after* widgets are in place
- // In PARAVIS module we do not wait for PVViewer_ViewWindow to be instanciated to have this:
- PVViewer_ViewManager::ParaviewInitBehaviors(true, aDesktop);
- PVViewer_ViewManager::ConnectToExternalPVServer(aDesktop);
-
pvCreateActions();
- pvCreateToolBars();
pvCreateMenus();
+ pvCreateToolBars();
+
+ PVViewer_ViewManager::ParaviewInitBehaviors(true, aDesktop);
QList<QDockWidget*> activeDocks = aDesktop->findChildren<QDockWidget*>();
QList<QMenu*> activeMenus = aDesktop->findChildren<QMenu*>();
// }
// }
- PVViewer_ViewManager::ParaviewLoadConfigurations();
+ // Connect after toolbar creation, etc ... as some activations of the toolbars is triggered
+ // by the ServerConnection event:
+ PVViewer_ViewManager::ParaviewLoadConfigurations(true);
+ PVViewer_ViewManager::ConnectToExternalPVServer(aDesktop);
updateObjBrowser();
// Find created toolbars
QCoreApplication::processEvents();
+ // process PVViewer toolbars (might be added by PVViewer created BEFORE activating ParaVis)
+ QList<QToolBar*> pvToolbars = myGuiElements->getToolbars();
+ foreach(QToolBar* aBar, pvToolbars) {
+ if (!myToolbars.contains(aBar)) {
+ myToolbars[aBar] = true;
+ myToolbarBreaks[aBar] = false;
+ aBar->setVisible(false);
+ aBar->toggleViewAction()->setVisible(false);
+ }
+ }
+
+ // process other toolbars (possibly added by Paraview)
QList<QToolBar*> allToolbars = aDesktop->findChildren<QToolBar*>();
foreach(QToolBar* aBar, allToolbars) {
- if (!foreignToolbars.contains(aBar)) {
+ if (!foreignToolbars.contains(aBar) && !myToolbars.contains(aBar)) {
myToolbars[aBar] = true;
myToolbarBreaks[aBar] = false;
aBar->setVisible(false);
}
}
+/*!
+ * \brief Slot called when the progress bar starts.
+ */
void PVGUI_Module::onStartProgress()
{
- QApplication::setOverrideCursor(Qt::WaitCursor);
+ // VSR 19/03/2015, issue 0023025
+ // next line is commented: it is bad idea to show wait cursor on ANY vtk event
+ // moreover, it does not work when running pvserver with --multi-client mode
+ //QApplication::setOverrideCursor(Qt::WaitCursor);
}
+/*!
+ * \brief Slot called when the progress bar is done.
+ */
void PVGUI_Module::onEndProgress()
{
- QApplication::restoreOverrideCursor();
+ // VSR 19/03/2015, issue 0023025
+ // next line is commented: it is bad idea to show wait cursor on ANY vtk event
+ // moreover, it does not work when running pvserver with --multi-client mode
+ //QApplication::restoreOverrideCursor();
}
void PVGUI_Module::onDataRepresentationUpdated() {
}
/*!
- \brief Initialisation timer event - trace start up
+ \brief Initialisation timer event - Starts up the Python trace
*/
void PVGUI_Module::onInitTimer()
{
return aFullPathSourceFiles;
}
+/*!
+ \brief Update the list of embedded macros
+*/
void PVGUI_Module::updateMacros()
{
pqPythonManager* aPythonManager = pqPVApplicationCore::instance()->pythonManager();
QApplication::restoreOverrideCursor();
}
+/*!
+ \brief Handler method for the output of messages.
+*/
static void ParavisMessageOutput(QtMsgType type, const char *msg)
{
switch(type)
if ( myToolbarsMenuId != -1 ) menuMgr()->show(myToolbarsMenuId);
// Update the various menus with the content pre-loaded in myGuiElements
- QMenu* srcMenu = menuMgr()->findMenu( mySourcesMenuId );
- myGuiElements->updateSourcesMenu(srcMenu);
- QMenu* filtMenu = menuMgr()->findMenu( myFiltersMenuId );
- myGuiElements->updateFiltersMenu(filtMenu);
- QMenu* macMenu = menuMgr()->findMenu( myMacrosMenuId );
- myGuiElements->updateMacrosMenu(macMenu);
+// QMenu* srcMenu = menuMgr()->findMenu( mySourcesMenuId );
+// myGuiElements->updateSourcesMenu(srcMenu);
+// QMenu* filtMenu = menuMgr()->findMenu( myFiltersMenuId );
+// myGuiElements->updateFiltersMenu(filtMenu);
+// QMenu* macMenu = menuMgr()->findMenu( myMacrosMenuId );
+// myGuiElements->updateMacrosMenu(macMenu);
setMenuShown( true );
setToolShown( true );
if ( myRecentMenuId != -1 ) menuMgr()->show(myRecentMenuId);
- //ClientFindOrCreateParavisComponent(PARAVIS::GetCStudy(this));
+ ClientFindOrCreateParavisComponent(PARAVIS::GetCStudy(this));
return isDone;
}
/*if (pqImplementation::helpWindow) {
pqImplementation::helpWindow->hide();
}*/
- showView( false );
// hide menus
menuMgr()->hide(myRecentMenuId);
menuMgr()->hide(mySourcesMenuId);
*/
void PVGUI_Module::studyClosed(SUIT_Study* study)
{
+ showView(false);
clearParaviewState();
LightApp_Module::studyClosed(study);
*/
QString PVGUI_Module::engineIOR() const
{
-// CORBA::String_var anIOR = GetCPPEngine()->GetIOR();
-// return QString(anIOR.in());
- return QString("");
+ CORBA::String_var anIOR = GetCPPEngine()->GetIOR();
+ return QString(anIOR.in());
}
/*!
}
/**!
+ * \brief Starts Python trace.
+ *
* Start trace invoking the newly introduced C++ API (PV 4.2)
* (inspired from pqTraceReaction::start())
*/
}
}
+/**!
+ * \brief Stops Python trace.
+ */
void PVGUI_Module::stopTrace()
{
vtkSMTrace::StopTrace();
}
+/**!
+ * \brief Execute a Python script.
+ */
void PVGUI_Module::executeScript(const char *script)
{
#ifndef WNT
/*!
- \brief Creates PARAVIS preference pane
+ \brief Creates PARAVIS preferences panel.
*/
void PVGUI_Module::createPreferences()
{
setPreferenceProperty(aParaViewSettingsTab, "stretch", false );
int aPanel = addPreference(QString(), aParaViewSettingsTab, LightApp_Preferences::UserDefined, PARAVIS_MODULE_NAME, "");
- setPreferenceProperty(aPanel, "content", (qint64)(new PVGUI_ParaViewSettingsPane()));
+ setPreferenceProperty(aPanel, "content", (qint64)(new PVGUI_ParaViewSettingsPane(0, getApp())));
// Paravis settings tab
int aParaVisSettingsTab = addPreference( tr( "TIT_PVISSETTINGS" ) );
}
}
+/*!
+ * \brief Slot called everytime the Python trace is pushed onto the CORBA engine.
+ */
void PVGUI_Module::onPushTraceTimer()
{
//MESSAGE("onPushTraceTimer(): Pushing trace to engine...");