X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPVGUI%2FPVGUI_Module.cxx;h=d134e80a86ce0c10eb5a675017fa1eb50618169d;hb=7b519e99b214707d1a363a24331c78ae09facef4;hp=d906110a70026030b77d5575723c9d6644d37729;hpb=479f44942f0011a5143a20353a576beaf1859e75;p=modules%2Fparavis.git diff --git a/src/PVGUI/PVGUI_Module.cxx b/src/PVGUI/PVGUI_Module.cxx index d906110a..d134e80a 100644 --- a/src/PVGUI/PVGUI_Module.cxx +++ b/src/PVGUI/PVGUI_Module.cxx @@ -1,6 +1,6 @@ // 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 @@ -19,7 +19,8 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // File : PVGUI_Module.cxx -// Author : Julia DOROVSKIKH + +#define PARAVIS_MODULE_NAME "PARAVIS" #include // E.A. must be included before Python.h to fix compilation on windows #ifdef HAVE_FINITE @@ -28,19 +29,20 @@ #include // Python first #include "PVGUI_Module.h" -#ifdef PARAVIS_WITH_FULL_CORBA -# include "PARAVIS_Gen_i.hh" -#endif - -//#include "PV_Tools.h" +#include CORBA_SERVER_HEADER(SALOME_ModuleCatalog) +#include CORBA_SERVER_HEADER(SALOMEDS) -#include "PVGUI_ViewModel.h" -#include "PVGUI_ViewManager.h" -#include "PVGUI_ViewWindow.h" +#include "PVViewer_ViewManager.h" +#include "PVViewer_ViewWindow.h" +#include "PVViewer_ViewModel.h" #include "PVGUI_Tools.h" #include "PVGUI_ParaViewSettingsPane.h" -#include "PVGUI_OutputWindowAdapter.h" +#include "PVViewer_GUIElements.h" +#include "PVViewer_EngineWrapper.h" +#include "PVGUI_DataModel.h" +// SALOME Includes +#include #include #include #include @@ -49,27 +51,27 @@ #include #include -// SALOME Includes -#include "SALOME_LifeCycleCORBA.hxx" -#include "SALOMEDS_SObject.hxx" - -#include "LightApp_SelectionMgr.h" -#include "LightApp_NameDlg.h" +#include +#include -#include +#include +#include +#include +#include // should ultimately be a LightApp only #include #include #include -#include -#include -#include -#include - -#include +#include +#include #include #include +#include + +// External includes +#include + #include #include #include @@ -89,146 +91,61 @@ #include #include +// Paraview includes +#include // for symbol PARAVIEW_VERSION +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include -#include #include #include -#include +#include #include #include -#include #include -#include #include -#include -#include -#include -#include -#include #include -#include #include -#include "pqInterfaceTracker.h" -#include #include #include -#include #include -#include #include -#include #include -#include -#include #include #include #include -#include -#include #include #include -#include - -#include - -#include - - -#include CORBA_SERVER_HEADER(SALOME_ModuleCatalog) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include - -#include - +#include +#include +#include +#include //---------------------------------------------------------------------------- -pqPVApplicationCore* PVGUI_Module::MyCoreApp = 0; -//PVGUI_OutputWindowAdapter* PVGUI_Module::pqImplementation::OutputWindowAdapter = 0; -//QPointer PVGUI_Module::pqImplementation::helpWindow = 0; - 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 Sphinx documentation first. -

Building and installing PARAVIS

- 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 - -

ParaView GUI integration

-

ParaView GUI integration overview

- - 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. - -

ParaView client initalization

- - 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. - - -

Multi-view manager

- - 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. - -

ParaView plugins

- 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) */ /*! @@ -237,67 +154,50 @@ PARAVIS_ORB::PARAVIS_Gen_var PVGUI_Module::myEngine; SALOME module wrapping ParaView GUI. */ +_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_::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()); + } -/* - Fix for the issue 21730: [CEA 596] Slice of polyhedron in PARAVIS returns no cell. - Wrap vtkEDFCutter filter. -*/ - -extern "C" void vtkEDFCutterCS_Initialize(vtkClientServerInterpreter*); -static void vtkEDFHelperInit(); - -void vtkEDFHelperInit(vtkClientServerInterpreter* interp){ - vtkEDFCutterCS_Initialize(interp); -} - -void vtkEDFHelperInit() { - vtkClientServerInterpreterInitializer::GetInitializer()-> - RegisterCallback(&vtkEDFHelperInit); -} - - - _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); - - //CORBA::ORB_var anORB = PARAVIS::PARAVIS_Gen_i::GetORB(); - int dnu; - CORBA::ORB_var anORB = CORBA::ORB_init(dnu, 0); // suppose ORB was already initialized - 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" ); + anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributePixMap"); + _PTR(AttributePixMap) aPixmap (anAttr); + aPixmap->SetPixMap( "pqAppIcon16.png" ); - // Create Attribute parameters for future using - anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeParameter"); + // Create Attribute parameters for future using + anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeParameter"); - aStudyBuilder->DefineComponentInstance(aSComponent, PVGUI_Module::GetEngine()->GetIOR()); - if (aLocked) theStudyDocument->GetProperties()->SetLocked(true); - aStudyBuilder->CommitCommand(); - } - return aSComponent; + 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() @@ -312,8 +212,7 @@ void paravisCleanUp() \brief Constructor. Sets the default name for the module. */ PVGUI_Module::PVGUI_Module() - : SalomeApp_Module( "PARAVIS" ), - // Implementation( 0 ), + : SalomeApp_Module( PARAVIS_MODULE_NAME ), mySelectionControlsTb( -1 ), mySourcesMenuId( -1 ), myFiltersMenuId( -1 ), @@ -324,7 +223,8 @@ PVGUI_Module::PVGUI_Module() myTraceWindow(0), myStateCounter(0), myInitTimer(0), - myPushTraceTimer(0) + myPushTraceTimer(0), + myGuiElements(0) { #ifdef HAS_PV_DOC Q_INIT_RESOURCE( PVGUI ); @@ -355,24 +255,51 @@ PVGUI_Module::~PVGUI_Module() delete myPushTraceTimer; if (myInitTimer) delete myInitTimer; - // Disconnect from server - pqServer* server = pqActiveObjects::instance().activeServer(); - if (server && server->isRemote()) - { - MESSAGE("~PVGUI_Module(): Disconnecting from remote server ..."); - pqServerDisconnectReaction::disconnectFromServer(); - } } -PARAVIS_ORB::PARAVIS_Gen_var PVGUI_Module::GetEngine() +/*! + * \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", "PARAVIS" ); - myEngine = PARAVIS_ORB::PARAVIS_Gen::_narrow( comp ); - } - return myEngine; + 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 module specific data model +*/ +CAM_DataModel* PVGUI_Module::createDataModel() +{ + return new PVGUI_DataModel( this ); +} + +/*! + * \brief Get the ParaView application singleton. + */ +pqPVApplicationCore * PVGUI_Module::GetPVApplication() +{ + return PVViewer_ViewManager::GetPVApplication(); } /*! @@ -381,14 +308,9 @@ PARAVIS_ORB::PARAVIS_Gen_var PVGUI_Module::GetEngine() */ void PVGUI_Module::initialize( CAM_Application* app ) { - // [ABN]: patched in ParaView's sources. - // PVGUI_MatplotlibMathTextUtilities::Disable(); + LightApp_Module::initialize( app ); - SalomeApp_Module::initialize( app ); - - // Create ParaViS actions createActions(); - // Create ParaViS menus createMenus(); // Uncomment to debug ParaView initialization @@ -399,69 +321,33 @@ void PVGUI_Module::initialize( CAM_Application* app ) aa = aa; } */ - - // Initialize ParaView client - pvInit(); - // Create GUI elements (menus, toolbars, dock widgets) - SalomeApp_Application* anApp = getApp(); + LightApp_Application* anApp = getApp(); SUIT_Desktop* aDesktop = anApp->desktop(); // Remember current state of desktop toolbars QList foreignToolbars = aDesktop->findChildren(); - // Simulate ParaView client main window - //Implementation = new pqImplementation( aDesktop ); + // Initialize ParaView client and associated behaviors + // and connect to externally launched pvserver + PVViewer_ViewManager::ParaviewInitApp(aDesktop, anApp->logWindow()); + myGuiElements = PVViewer_GUIElements::GetInstance(aDesktop); + // [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(); pvCreateActions(); - pvCreateToolBars(); pvCreateMenus(); + pvCreateToolBars(); + + PVViewer_ViewManager::ParaviewInitBehaviors(true, aDesktop); QList activeDocks = aDesktop->findChildren(); QList activeMenus = aDesktop->findChildren(); - // new pqParaViewBehaviors(anApp->desktop(), this); - // Has to be replaced in order to exclude using of pqQtMessageHandlerBehaviour - // Start pqParaViewBehaviors - // Register ParaView interfaces. - //pqPluginManager* pgm = pqApplicationCore::instance()->getPluginManager(); - pqInterfaceTracker* pgm = pqApplicationCore::instance()->interfaceTracker(); - - // * adds support for standard paraview views. - pgm->addInterface(new pqStandardViewModules(pgm)); - //pgm->addInterface(new pqStandardSummaryPanelImplementation(pgm)); - pgm->addInterface(new pqStandardPropertyWidgetInterface(pgm)); - - // Load plugins distributed with application. - pqApplicationCore::instance()->loadDistributedPlugins(); - - // Define application behaviors. - //new pqQtMessageHandlerBehavior(this); - new pqDataTimeStepBehavior(this); - new pqViewFrameActionsBehavior(this); - new pqSpreadSheetVisibilityBehavior(this); - new pqPipelineContextMenuBehavior(this); - new pqObjectPickingBehavior(this); // NEW in 4.1 - new pqDefaultViewBehavior(this); - new pqAlwaysConnectedBehavior(this); - new pqPVNewSourceBehavior(this); - new pqDeleteBehavior(this); - new pqUndoRedoBehavior(this); - new pqCrashRecoveryBehavior(this); - new pqAutoLoadPluginXMLBehavior(this); - new pqPluginDockWidgetsBehavior(aDesktop); - //new pqVerifyRequiredPluginBehavior(this); - new pqPluginActionGroupBehavior(aDesktop); - //new pqFixPathsInStateFilesBehavior(this); - new pqCommandLineOptionsBehavior(this); - new pqPersistentMainWindowStateBehavior(aDesktop); - new pqObjectPickingBehavior(aDesktop); - new pqCollaborationBehavior(this); - //new pqMultiServerBehavior(this); - new pqViewStreamingBehavior(this); - // Setup quick-launch shortcuts. QShortcut *ctrlSpace = new QShortcut(Qt::CTRL + Qt::Key_Space, aDesktop); QObject::connect(ctrlSpace, SIGNAL(activated()), @@ -477,34 +363,42 @@ void PVGUI_Module::initialize( CAM_Application* app ) } } - // Find Plugin Menus - QList currentMenus = aDesktop->findChildren(); - QList::iterator im; - for (im = currentMenus.begin(); im != currentMenus.end(); ++im) { - if(!activeMenus.contains(*im)) { - myMenus.append(*im); - } - } - - SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - QString aPath = resMgr->stringValue("resources", "PARAVIS", QString()); - if (!aPath.isNull()) { - MyCoreApp->loadConfiguration(aPath + QDir::separator() + "ParaViewFilters.xml"); - MyCoreApp->loadConfiguration(aPath + QDir::separator() + "ParaViewReaders.xml"); - MyCoreApp->loadConfiguration(aPath + QDir::separator() + "ParaViewSources.xml"); - MyCoreApp->loadConfiguration(aPath + QDir::separator() + "ParaViewWriters.xml"); - } + // Find Plugin Menus + // [ABN] TODO: fix this - triggers a SEGFAULT at deactivation() time. +// QList currentMenus = aDesktop->findChildren(); +// QList::iterator im; +// for (im = currentMenus.begin(); im != currentMenus.end(); ++im) { +// if(!activeMenus.contains(*im)) { +// QString s = (*im)->title(); +// std::cout << " MENU "<< s.toStdString() << std::endl; +// myMenus.append(*im); +// } +// } - // Force creation of the PARAVIS engine - GetEngine(); + // 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 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 allToolbars = aDesktop->findChildren(); foreach(QToolBar* aBar, allToolbars) { - if (!foreignToolbars.contains(aBar)) { + if (!foreignToolbars.contains(aBar) && !myToolbars.contains(aBar)) { myToolbars[aBar] = true; myToolbarBreaks[aBar] = false; aBar->setVisible(false); @@ -514,19 +408,11 @@ void PVGUI_Module::initialize( CAM_Application* app ) updateMacros(); - // we need to start trace after connection is done - connect(pqApplicationCore::instance()->getObjectBuilder(), SIGNAL(finishedAddingServer(pqServer*)), - this, SLOT(onFinishedAddingServer(pqServer*))); - - connect(pqApplicationCore::instance()->getObjectBuilder(), SIGNAL(dataRepresentationCreated(pqDataRepresentation*)), - this, SLOT(onDataRepresentationCreated(pqDataRepresentation*))); - SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr(); - bool isStop = aResourceMgr->booleanValue( "PARAVIS", "stop_trace", false ); + bool isStop = aResourceMgr->booleanValue( PARAVIS_MODULE_NAME, "stop_trace", false ); if(!isStop) { // Start a timer to schedule asap: - // - the connection to the server // - the trace start myInitTimer = new QTimer(aDesktop); QObject::connect(myInitTimer, SIGNAL(timeout()), this, SLOT(onInitTimer()) ); @@ -555,95 +441,28 @@ void PVGUI_Module::initialize( CAM_Application* app ) } } } - - connect(&pqActiveObjects::instance(), - SIGNAL(representationChanged(pqRepresentation*)), - this, SLOT(onRepresentationChanged(pqRepresentation*))); - -// MESSAGE("initialize(): Initializing PARAVIS's Python context ..."); -// execPythonCommand("import paraview.servermanager as sm; sm.fromGUI=True", false); -// MESSAGE("initialize(): Initialized."); -} - -bool PVGUI_Module::connectToExternalPVServer() -{ - pqServer* server = pqActiveObjects::instance().activeServer(); - if (server && server->isRemote()) - { - // Already connected to an external server, do nothing - MESSAGE("connectToExternalPVServer(): Already connected to an external PVServer, won't reconnect."); - return false; - } - - std::stringstream msg; - - // Try to connect to the external PVServer - gives priority to an externally specified URL: - QString serverUrlEnv = getenv("PARAVIS_PVSERVER_URL"); - std::string serverUrl; - if (!serverUrlEnv.isEmpty()) - serverUrl = serverUrlEnv.toStdString(); - else - { - // Get the URL from the engine (possibly starting the pvserver) - CORBA::String_var url = GetEngine()->FindOrStartPVServer(0); // take the first free port - serverUrl = (char *)url; - } - - msg << "connectToExternalPVServer(): Trying to connect to the external PVServer '" << serverUrl << "' ..."; - MESSAGE(msg.str()); - - if (!pqServerConnectReaction::connectToServer(pqServerResource(serverUrl.c_str()))) - { - std::stringstream msg2; - msg2 << "Error while connecting to the requested pvserver '" << serverUrl; - msg2 << "'. Might use default built-in connection instead!" << std::endl; - qWarning(msg2.str().c_str()); // will go to the ParaView console (see ParavisMessageOutput below) - SUIT_MessageBox::warning( getApp()->desktop(), - QString("Error connecting to PVServer"), QString(msg2.str().c_str())); - return false; - } - else - MESSAGE("connectToExternalPVServer(): Connected!"); - return true; } +/*! + * \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(); -} - -void PVGUI_Module::onFinishedAddingServer(pqServer* /*server*/) -{ - SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr(); - bool isStop = aResourceMgr->booleanValue( "PARAVIS", "stop_trace", false ); - if(!isStop) - startTimer( 500 ); -} - -void PVGUI_Module::onDataRepresentationCreated(pqDataRepresentation* data) { - if(!data) - return; - - if(!data->getLookupTable()) - return; - - SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr(); - if(!aResourceMgr) - return; - - bool visible = aResourceMgr->booleanValue( "PARAVIS", "show_color_legend", false ); - pqLookupTableManager* lut_mgr = pqApplicationCore::instance()->getLookupTableManager(); - - if(lut_mgr) { - lut_mgr->setScalarBarVisibility(data,visible); - } - - connect(data, SIGNAL(dataUpdated()), this, SLOT(onDataRepresentationUpdated())); + // 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() { @@ -653,108 +472,12 @@ void PVGUI_Module::onDataRepresentationUpdated() { activeStudy->Modified(); } -void PVGUI_Module::onVariableChanged(pqVariableType t, const QString) { - - pqDisplayColorWidget* colorWidget = qobject_cast(sender()); - if( !colorWidget ) - return; - - if( t == VARIABLE_TYPE_NONE ) - return; - - SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr(); - - if(!aResourceMgr) - return; - - bool visible = aResourceMgr->booleanValue( "PARAVIS", "show_color_legend", false ); - - if(!visible) - return; - - /*//VTN: getRepresentation is protected - pqDataRepresentation* data = colorWidget->getRepresentation(); - - if( !data->getLookupTable() ) - return; - - pqLookupTableManager* lut_mgr = pqApplicationCore::instance()->getLookupTableManager(); - - if(lut_mgr) { - lut_mgr->setScalarBarVisibility(data,visible); - } - */ - pqColorToolbar* colorTooBar = qobject_cast(colorWidget->parent()); - if( !colorTooBar ) - return; - - pqScalarBarVisibilityReaction* scalarBarVisibility = colorTooBar->findChild(); - if(scalarBarVisibility) { - scalarBarVisibility->setScalarBarVisibility(visible); - } -} - -void PVGUI_Module::execPythonCommand(const QString& cmd, bool inSalomeConsole) -{ - if ( inSalomeConsole ) { - if ( PyInterp_Dispatcher::Get()->IsBusy() ) return; - SalomeApp_Application* app = - dynamic_cast< SalomeApp_Application* >(SUIT_Session::session()->activeApplication()); - PyConsole_Console* pyConsole = app->pythonConsole(); - if (pyConsole) - pyConsole->exec(cmd); - } - else - { - SalomeApp_Application* app = - dynamic_cast< SalomeApp_Application* >(SUIT_Session::session()->activeApplication()); - PyConsole_Interp* pyInterp = app->pythonConsole()->getInterp(); - PyLockWrapper aGil; - pyInterp->run(cmd.toStdString().c_str()); -// pqPythonManager* manager = qobject_cast -// ( pqApplicationCore::instance()->manager( "PYTHON_MANAGER" ) ); -// if ( manager ) -// { -// pqPythonDialog* pyDiag = manager->pythonShellDialog(); -// if ( pyDiag ) -// { -// pqPythonShell* shell = pyDiag->shell(); -// if ( shell ) { -// shell->executeScript(cmd); -// } -// } -// } - } -} - /*! - \brief Initialisation timer event - fired only once, after the GUI loop is ready. - See creation in initialize(). + \brief Initialisation timer event - Starts up the Python trace */ void PVGUI_Module::onInitTimer() { -#ifndef PARAVIS_WITH_FULL_CORBA - connectToExternalPVServer(); -#endif - -#ifndef WNT -// if ( PyInterp_Dispatcher::Get()->IsBusy() ) -// { -// // Reschedule for later -// MESSAGE("interpreter busy -> rescheduling trace start."); -// startTimer(500); -// } -// else -// { - MESSAGE("timerEvent(): About to start trace...."); - execPythonCommand("from paraview import smtrace;smtrace.start_trace()", false); - MESSAGE("timerEvent(): Trace STARTED...."); -// } -#endif - - MESSAGE("initialize(): Initializing PARAVIS's Python context ..."); - execPythonCommand("import paraview.servermanager as sm; sm.fromGUI=True", false); - MESSAGE("initialize(): Initialized."); + startTrace(); } /*! @@ -778,6 +501,9 @@ QStringList PVGUI_Module::getEmbeddedMacrosList() return aFullPathSourceFiles; } +/*! + \brief Update the list of embedded macros +*/ void PVGUI_Module::updateMacros() { pqPythonManager* aPythonManager = pqPVApplicationCore::instance()->pythonManager(); @@ -803,89 +529,25 @@ void PVGUI_Module::windows( QMap& m ) const m.insert( LightApp_Application::WT_LogWindow, Qt::BottomDockWidgetArea ); } -/*! - \brief Static method, performs initialization of ParaView session. - \return \c true if ParaView has been initialized successfully, otherwise false -*/ -bool PVGUI_Module::pvInit() -{ - // if ( !pqImplementation::Core ){ - if ( ! MyCoreApp) { - // Obtain command-line arguments - int argc = 0; - char** argv = 0; - QString aOptions = getenv("PARAVIS_OPTIONS"); - QStringList aOptList = aOptions.split(":", QString::SkipEmptyParts); - argv = new char*[aOptList.size() + 1]; - QStringList args = QApplication::arguments(); - argv[0] = (args.size() > 0)? strdup(args[0].toLatin1().constData()) : strdup("paravis"); - argc++; - - foreach (QString aStr, aOptList) { - argv[argc] = strdup( aStr.toLatin1().constData() ); - argc++; - } - MyCoreApp = new pqPVApplicationCore (argc, argv); - if (MyCoreApp->getOptions()->GetHelpSelected() || - MyCoreApp->getOptions()->GetUnknownArgument() || - MyCoreApp->getOptions()->GetErrorMessage() || - MyCoreApp->getOptions()->GetTellVersion()) { - return false; - } - - /* VTN: Looks like trash. For porting see branded_paraview_initializer.cxx.in - // Not sure why this is needed. Andy added this ages ago with comment saying - // needed for Mac apps. Need to check that it's indeed still required. - QDir dir(QApplication::applicationDirPath()); - dir.cdUp(); - dir.cd("Plugins"); - QApplication::addLibraryPath(dir.absolutePath()); - // Load required application plugins. - QString plugin_string = ""; - QStringList plugin_list = plugin_string.split(';',QString::SkipEmptyParts); - pqBrandPluginsLoader loader; - if (loader.loadPlugins(plugin_list) == false) { - printf("Failed to load required plugins for this application\n"); - return false; - } - - // Load optional plugins. - plugin_string = ""; - plugin_list = plugin_string.split(';',QString::SkipEmptyParts); - loader.loadPlugins(plugin_list, true); //quietly skip not-found plugins. - */ - // End of Initializer code - - vtkOutputWindow::SetInstance(PVGUI_OutputWindowAdapter::New()); - - new pqTabbedMultiViewWidget(); // it registers as "MULTIVIEW_WIDGET on creation - - for (int i = 0; i < argc; i++) - free(argv[i]); - delete[] argv; - } - - return true; -} - /*! \brief Shows (toShow = true) or hides ParaView view window */ void PVGUI_Module::showView( bool toShow ) { - SalomeApp_Application* anApp = getApp(); - PVGUI_ViewManager* viewMgr = - dynamic_cast( anApp->getViewManager( PVGUI_Viewer::Type(), false ) ); + LightApp_Application* anApp = getApp(); + PVViewer_ViewManager* viewMgr = + dynamic_cast( anApp->getViewManager( PVViewer_Viewer::Type(), false ) ); if ( !viewMgr ) { - viewMgr = new PVGUI_ViewManager( anApp->activeStudy(), anApp->desktop() ); + viewMgr = new PVViewer_ViewManager( anApp->activeStudy(), anApp->desktop(), anApp->logWindow() ); anApp->addViewManager( viewMgr ); connect( viewMgr, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ), anApp, SLOT( onCloseView( SUIT_ViewManager* ) ) ); } - PVGUI_ViewWindow* pvWnd = dynamic_cast( viewMgr->getActiveView() ); + PVViewer_ViewWindow* pvWnd = dynamic_cast( viewMgr->getActiveView() ); if ( !pvWnd ) { - pvWnd = dynamic_cast( viewMgr->createViewWindow() ); + pvWnd = dynamic_cast( viewMgr->createViewWindow() ); + // this also connects to the pvserver and instantiates relevant PV behaviors } pvWnd->setShown( toShow ); @@ -928,14 +590,8 @@ void PVGUI_Module::endWaitCursor() } /*! - \brief Returns the ParaView multi-view manager. + \brief Handler method for the output of messages. */ -pqTabbedMultiViewWidget* PVGUI_Module::getMultiViewManager() const -{ - return qobject_cast(pqApplicationCore::instance()->manager("MULTIVIEW_WIDGET")); -} - - static void ParavisMessageOutput(QtMsgType type, const char *msg) { switch(type) @@ -955,8 +611,6 @@ static void ParavisMessageOutput(QtMsgType type, const char *msg) } } - - /*! \brief Activate module. \param study current study @@ -971,14 +625,23 @@ bool PVGUI_Module::activateModule( SUIT_Study* study ) storeCommonWindowsState(); - bool isDone = SalomeApp_Module::activateModule( study ); + bool isDone = LightApp_Module::activateModule( study ); if ( !isDone ) return false; showView( true ); if ( mySourcesMenuId != -1 ) menuMgr()->show(mySourcesMenuId); if ( myFiltersMenuId != -1 ) menuMgr()->show(myFiltersMenuId); - if ( myFiltersMenuId != -1 ) menuMgr()->show(myMacrosMenuId); - if ( myFiltersMenuId != -1 ) menuMgr()->show(myToolbarsMenuId); + if ( myMacrosMenuId != -1 ) menuMgr()->show(myMacrosMenuId); + 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); + setMenuShown( true ); setToolShown( true ); @@ -1064,7 +727,7 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study ) restoreCommonWindowsState(); - return SalomeApp_Module::deactivateModule( study ); + return LightApp_Module::deactivateModule( study ); } @@ -1078,15 +741,29 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study ) */ void PVGUI_Module::onApplicationClosed( SUIT_Application* theApp ) { - pqApplicationCore::instance()->settings()->sync(); + PVViewer_ViewManager::ParaviewCleanup(); + int aAppsNb = SUIT_Session::session()->applications().size(); if (aAppsNb == 1) { - MyCoreApp->deleteLater(); + deleteTemporaryFiles(); } CAM_Module::onApplicationClosed(theApp); } +/*! + \brief Deletes temporary files created during import operation from VISU +*/ +void PVGUI_Module::deleteTemporaryFiles() +{ + foreach(QString aFile, myTemporaryFiles) { + if (QFile::exists(aFile)) { + QFile::remove(aFile); + } + } +} + + /*! \brief Called when study is closed. @@ -1098,7 +775,7 @@ void PVGUI_Module::studyClosed(SUIT_Study* study) { clearParaviewState(); - SalomeApp_Module::studyClosed(study); + LightApp_Module::studyClosed(study); } /*! @@ -1110,9 +787,9 @@ void PVGUI_Module::onModelOpened() if(!studyDS) { return; } - - _PTR(SComponent) paravisComp = - studyDS->FindComponent(GetEngine()->ComponentDataType()); + + _PTR(SComponent) paravisComp = + studyDS->FindComponent(PARAVIS_MODULE_NAME); if(!paravisComp) { return; } @@ -1132,15 +809,14 @@ void PVGUI_Module::onModelOpened() } /*! - \brief Returns IOR of current engine +\brief Returns IOR of current engine */ QString PVGUI_Module::engineIOR() const { - CORBA::String_var anIOR = GetEngine()->GetIOR(); + CORBA::String_var anIOR = GetCPPEngine()->GetIOR(); return QString(anIOR.in()); } - /*! \brief Open file of format supported by ParaView */ @@ -1151,6 +827,44 @@ void PVGUI_Module::openFile(const char* theName) pqLoadDataReaction::loadData(aFiles); } +/**! + * \brief Starts Python trace. + * + * Start trace invoking the newly introduced C++ API (PV 4.2) + * (inspired from pqTraceReaction::start()) + */ +void PVGUI_Module::startTrace() +{ + vtkSMSessionProxyManager* pxm = pqActiveObjects::instance().activeServer()->proxyManager(); + + vtkSmartPointer proxy; + proxy.TakeReference(pxm->NewProxy("pythontracing", "PythonTraceOptions")); + if (proxy) + { + vtkNew controller; + controller->InitializeProxy(proxy); + } + vtkSMTrace* trace = vtkSMTrace::StartTrace(); + if (proxy) + { + // Set manually the properties entered via the dialog box poping-up when requiring + // a trace start in PV4.2 (trace options) + trace->SetPropertiesToTraceOnCreate(vtkSMTrace::RECORD_USER_MODIFIED_PROPERTIES); + trace->SetFullyTraceSupplementalProxies(false); + } +} + +/**! + * \brief Stops Python trace. + */ +void PVGUI_Module::stopTrace() +{ + vtkSMTrace::StopTrace(); +} + +/**! + * \brief Execute a Python script. + */ void PVGUI_Module::executeScript(const char *script) { #ifndef WNT @@ -1192,40 +906,29 @@ void PVGUI_Module::executeScript(const char *script) \brief Returns trace string */ static const QString MYReplaceStr("paraview.simple"); -static const QString MYReplaceImportStr("except: from pvsimple import *"); QString PVGUI_Module::getTraceString() { - QString traceString; -#ifndef WNT - { - PyLockWrapper lck; // Acquire GIL - - const char * code = "from paraview import smtrace;" - "__smtraceString = smtrace.get_trace_string()"; - PyRun_SimpleString(code); - // Now get the value of __smtraceString - PyObject* main_module = PyImport_AddModule((char*)"__main__"); - PyObject* global_dict = PyModule_GetDict(main_module); - PyObject* string_object = PyDict_GetItemString(global_dict, "__smtraceString"); - char* string_ptr = string_object ? PyString_AsString(string_object) : 0; - if (string_ptr) { - traceString = string_ptr; - } - } // release GIL - + vtkSMTrace *tracer = vtkSMTrace::GetActiveTracer(); + if (!tracer) // trace is not started + return QString(""); + + QString traceString(tracer->GetCurrentTrace()); + std::stringstream nl; nl << std::endl; // surely there is some Qt trick to do that in a portable way?? + QString end_line(nl.str().c_str()); + // 'import pvsimple' is necessary to fix the first call to DisableFirstRenderCamera in the paraview trace + // 'ShowParaviewView()' ensure there is an opened viewing window (otherwise SEGFAULT!) + traceString = "import pvsimple" + end_line + + "pvsimple.ShowParaviewView()" + end_line + traceString; + + // Replace import "paraview.simple" by "pvsimple" if ((!traceString.isNull()) && traceString.length() != 0) { int aPos = traceString.indexOf(MYReplaceStr); while (aPos != -1) { traceString = traceString.replace(aPos, MYReplaceStr.length(), "pvsimple"); aPos = traceString.indexOf(MYReplaceStr, aPos); } - int aImportPos = traceString.indexOf(MYReplaceImportStr); - if(aImportPos != -1) - { - traceString = traceString.replace(aImportPos, MYReplaceImportStr.length(), "except:\n import pvsimple\n from pvsimple import *"); - } } -#endif + return traceString; } @@ -1283,22 +986,27 @@ pqServer* PVGUI_Module::getActiveServer() /*! - \brief Creates PARAVIS preference pane + \brief Creates PARAVIS preferences panel. */ void PVGUI_Module::createPreferences() { // Paraview settings tab int aParaViewSettingsTab = addPreference( tr( "TIT_PVIEWSETTINGS" ) ); - int aPanel = addPreference(QString(), aParaViewSettingsTab, LightApp_Preferences::UserDefined, "PARAVIS", ""); - setPreferenceProperty(aPanel, "content", (qint64)(new PVGUI_ParaViewSettingsPane())); + + setPreferenceProperty(aParaViewSettingsTab, "stretch", false ); + int aPanel = addPreference(QString(), aParaViewSettingsTab, LightApp_Preferences::UserDefined, PARAVIS_MODULE_NAME, ""); + + setPreferenceProperty(aPanel, "content", (qint64)(new PVGUI_ParaViewSettingsPane(0, getApp()))); // Paravis settings tab int aParaVisSettingsTab = addPreference( tr( "TIT_PVISSETTINGS" ) ); - addPreference( tr( "PREF_STOP_TRACE" ), aParaVisSettingsTab, LightApp_Preferences::Bool, "PARAVIS", "stop_trace"); + addPreference( tr( "PREF_STOP_TRACE" ), aParaVisSettingsTab, LightApp_Preferences::Bool, PARAVIS_MODULE_NAME, "stop_trace"); + + addPreference( tr( "PREF_NO_EXT_PVSERVER" ), aParaVisSettingsTab, LightApp_Preferences::Bool, PARAVIS_MODULE_NAME, "no_ext_pv_server"); int aSaveType = addPreference(tr( "PREF_SAVE_TYPE_LBL" ), aParaVisSettingsTab, LightApp_Preferences::Selector, - "PARAVIS", "savestate_type"); + PARAVIS_MODULE_NAME, "savestate_type"); QList aIndices; QStringList aStrings; aIndices<<0<<1<<2; @@ -1307,10 +1015,6 @@ void PVGUI_Module::createPreferences() aStrings<objectBrowser(); bool isOBClient = (ob && theClient == ob->popupClientType()); @@ -1333,22 +1037,22 @@ void PVGUI_Module::contextMenuPopup(const QString& theClient, QMenu* theMenu, QS aSelectionMgr->selectedObjects(aListIO); if (aListIO.Extent() == 1 && aListIO.First()->hasEntry()) { QString entry = QString(aListIO.First()->getEntry()); - + // Get active study - SalomeApp_Study* activeStudy = + SalomeApp_Study* activeStudy = dynamic_cast(getApp()->activeStudy()); if(!activeStudy) { return; } - // Get SALOMEDS client study + // Get SALOMEDS client study _PTR(Study) studyDS = activeStudy->studyDS(); if(!studyDS) { return; } - QString paravisDataType(GetEngine()->ComponentDataType()); - if(activeStudy && activeStudy->isComponent(entry) && + QString paravisDataType(PARAVIS_MODULE_NAME); + if(activeStudy && activeStudy->isComponent(entry) && activeStudy->componentDataType(entry) == paravisDataType) { // ParaViS module object theMenu->addSeparator(); @@ -1356,12 +1060,12 @@ void PVGUI_Module::contextMenuPopup(const QString& theClient, QMenu* theMenu, QS } else { // Try to get state object - _PTR(SObject) stateSObj = + _PTR(SObject) stateSObj = studyDS->FindObjectID(entry.toLatin1().constData()); if (!stateSObj) { return; } - + // Check local id _PTR(GenericAttribute) anAttr; if (!stateSObj->FindAttribute(anAttr, "AttributeLocalID")) { @@ -1369,7 +1073,7 @@ void PVGUI_Module::contextMenuPopup(const QString& theClient, QMenu* theMenu, QS } _PTR(AttributeLocalID) anID(anAttr); - + if (anID->Value() == PVSTATEID) { // Paraview state object theMenu->addSeparator(); @@ -1403,18 +1107,8 @@ void PVGUI_Module::onShowTrace() */ void PVGUI_Module::onRestartTrace() { - QString script = "from paraview import smtrace\n"; - script += "smtrace.stop_trace()\n"; - script += "smtrace.start_trace()\n"; - execPythonCommand(script, false); -} - -/*! - \brief Show ParaView view. -*/ -void PVGUI_Module::onNewParaViewWindow() -{ - showView(true); + stopTrace(); + startTrace(); } /*! @@ -1429,9 +1123,9 @@ void PVGUI_Module::onSaveMultiState() if(!studyDS) { return; } - + _PTR(SComponent) paravisComp = - studyDS->FindComponent(GetEngine()->ComponentDataType()); + studyDS->FindComponent(PARAVIS_MODULE_NAME); if(!paravisComp) { return; } @@ -1595,9 +1289,12 @@ void PVGUI_Module::onDelete() } } +/*! + * \brief Slot called everytime the Python trace is pushed onto the CORBA engine. + */ void PVGUI_Module::onPushTraceTimer() { -// MESSAGE("onPushTraceTimer(): Pushing trace to engine..."); + //MESSAGE("onPushTraceTimer(): Pushing trace to engine..."); GetEngine()->PutPythonTraceStringToEngine(getTraceString().toStdString().c_str()); } @@ -1676,24 +1373,6 @@ void PVGUI_Module::loadSelectedState(bool toClear) } } -void PVGUI_Module::onRepresentationChanged(pqRepresentation*) { - - - //rnv: to fix the issue "21712: [CEA 581] Preference to display legend by default" - // find the pqDisplayColorWidget instances and connect the variableChanged SIGNAL on the - // onVariableChanged slot of this class. This connection needs to change visibility - // of the "Colored Legend" after change the "Color By" array. - QList aWidget = getApp()->desktop()->findChildren(); - - for (int i = 0; i < aWidget.size() ; i++ ) { - if( aWidget[i] ) { - connect( aWidget[i], SIGNAL ( variableChanged ( pqVariableType, const QString ) ), - this, SLOT(onVariableChanged( pqVariableType, const QString) ), Qt::UniqueConnection ); - } - } -} - - /*! \fn CAM_Module* createModule(); \brief Export module instance (factory function). @@ -1710,10 +1389,6 @@ extern "C" { bool flag = false; PVGUI_EXPORT CAM_Module* createModule() { - if(!flag) { - vtkEDFHelperInit(); - flag = true; - } return new PVGUI_Module(); }