X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPVGUI%2FPVGUI_Module.cxx;h=39c8b2435203ecb39495b2a29dbb1fb952a2f9d7;hb=e832581d8d1b9b52625e733e4c8b43b8a4f54e98;hp=70b4b50ff88ab98d5be3ef847c91067e57976f1b;hpb=194119f8de4a74d655c696de67a77c88048ac4f9;p=modules%2Fparavis.git diff --git a/src/PVGUI/PVGUI_Module.cxx b/src/PVGUI/PVGUI_Module.cxx index 70b4b50f..39c8b243 100644 --- a/src/PVGUI/PVGUI_Module.cxx +++ b/src/PVGUI/PVGUI_Module.cxx @@ -1,11 +1,11 @@ // PARAVIS : ParaView wrapper SALOME module // -// Copyright (C) 2010-2013 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 // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -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,24 +29,20 @@ #include // Python first #include "PVGUI_Module.h" -#include "SALOMEconfig.h" -#ifdef WITH_VISU -#include CORBA_CLIENT_HEADER(VISU_Gen) -#endif +#include CORBA_SERVER_HEADER(SALOME_ModuleCatalog) #include CORBA_SERVER_HEADER(SALOMEDS) - -#include "PARAVIS_Gen_i.hh" - -#include "PV_Tools.h" - -#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 @@ -54,22 +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 + +// External includes +#include + #include #include #include @@ -89,166 +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 -#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 - -#include CORBA_SERVER_HEADER(SALOME_ModuleCatalog) - -/* - * Make sure all the kits register their classes with vtkInstantiator. - * Since ParaView uses Tcl wrapping, all of VTK is already compiled in - * anyway. The instantiators will add no more code for the linker to - * collect. - */ - -//#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 - +#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; +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) */ /*! @@ -257,68 +154,50 @@ PVGUI_Module* ParavisModule = 0; 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(); - 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"); - + anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributePixMap"); + _PTR(AttributePixMap) aPixmap (anAttr); + aPixmap->SetPixMap( "pqAppIcon16.png" ); - PARAVIS::PARAVIS_Gen_var aPARAVIS = PARAVIS::PARAVIS_Gen_i::GetParavisGenImpl()->_this(); + // Create Attribute parameters for future using + anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeParameter"); - aStudyBuilder->DefineComponentInstance(aSComponent, aPARAVIS->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() @@ -333,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 ), @@ -343,22 +221,28 @@ PVGUI_Module::PVGUI_Module() myRecentMenuId(-1), myOldMsgHandler(0), myTraceWindow(0), - myStateCounter(0) + myStateCounter(0), + myInitTimer(0), + myPushTraceTimer(0), + myGuiElements(0) { #ifdef HAS_PV_DOC Q_INIT_RESOURCE( PVGUI ); #endif ParavisModule = this; - // Clear old macros + // Clear old copies of embedded macros files QString aDestPath = QString( "%1/.config/%2/Macros" ).arg( QDir::homePath() ).arg( QApplication::applicationName() ); QStringList aFilter; aFilter << "*.py"; QDir aDestDir(aDestPath); QStringList aDestFiles = aDestDir.entryList(aFilter, QDir::Files); - foreach (QString aStr, aDestFiles) { - aDestDir.remove(aStr); + foreach (QString aMacrosPath, getEmbeddedMacrosList()) { + QString aMacrosName = QFileInfo(aMacrosPath).fileName(); + if (aDestFiles.contains(aMacrosName)) { + aDestDir.remove(aMacrosName); + } } } @@ -367,9 +251,56 @@ PVGUI_Module::PVGUI_Module() */ PVGUI_Module::~PVGUI_Module() { + if (myPushTraceTimer) + delete myPushTraceTimer; + if (myInitTimer) + 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 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(); +} /*! \brief Initialize module. Creates menus, prepares context menu, etc. @@ -377,14 +308,9 @@ PVGUI_Module::~PVGUI_Module() */ void PVGUI_Module::initialize( CAM_Application* app ) { - //VTN: Disable conflict with python initialization for MatPlot. - PVGUI_MatplotlibMathTextUtilities::Disable(); - - SalomeApp_Module::initialize( app ); + LightApp_Module::initialize( app ); - // Create ParaViS actions createActions(); - // Create ParaViS menus createMenus(); // Uncomment to debug ParaView initialization @@ -395,137 +321,110 @@ void PVGUI_Module::initialize( CAM_Application* app ) aa = aa; } */ - - // Initialize ParaView client - pvInit(); - // Create GUI elements (menus, toolbars, dock widgets) - //if ( !Implementation ){ - SalomeApp_Application* anApp = getApp(); - SUIT_Desktop* aDesktop = anApp->desktop(); + LightApp_Application* anApp = getApp(); + SUIT_Desktop* aDesktop = anApp->desktop(); - // connect(aDesktop, SIGNAL() + // Remember current state of desktop toolbars + QList foreignToolbars = aDesktop->findChildren(); - // Remember current state of desktop toolbars - QList foreignToolbars = aDesktop->findChildren(); + // Initialize ParaView client and associated behaviors + // and connect to externally launched pvserver + PVViewer_ViewManager::ParaviewInitApp(aDesktop, anApp->logWindow()); + myGuiElements = PVViewer_GUIElements::GetInstance(aDesktop); - // Simulate ParaView client main window - //Implementation = new pqImplementation( 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(); - setupDockWidgets(); - - pvCreateActions(); - pvCreateToolBars(); - pvCreateMenus(); - - 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 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()), - pqApplicationCore::instance(), SLOT(quickLaunch())); - - // Find Plugin Dock Widgets - QList currentDocks = aDesktop->findChildren(); - QList::iterator i; - for (i = currentDocks.begin(); i != currentDocks.end(); ++i) { - if(!activeDocks.contains(*i)) { - myDockWidgets[*i] = false; // hidden by default - (*i)->hide(); - } + pvCreateActions(); + pvCreateMenus(); + pvCreateToolBars(); + + PVViewer_ViewManager::ParaviewInitBehaviors(true, aDesktop); + + QList activeDocks = aDesktop->findChildren(); + QList activeMenus = aDesktop->findChildren(); + + // Setup quick-launch shortcuts. + QShortcut *ctrlSpace = new QShortcut(Qt::CTRL + Qt::Key_Space, aDesktop); + QObject::connect(ctrlSpace, SIGNAL(activated()), + pqApplicationCore::instance(), SLOT(quickLaunch())); + + // Find Plugin Dock Widgets + QList currentDocks = aDesktop->findChildren(); + QList::iterator i; + for (i = currentDocks.begin(); i != currentDocks.end(); ++i) { + if(!activeDocks.contains(*i)) { + myDockWidgets[*i] = false; // hidden by default + (*i)->hide(); } + } // 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); - } - } + // [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); +// } +// } + + // 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(); - 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 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); } - - // Force creation of engine - PARAVIS::GetParavisGen(this); - updateObjBrowser(); - - // Find created toolbars - QCoreApplication::processEvents(); + } - QList allToolbars = aDesktop->findChildren(); - foreach(QToolBar* aBar, allToolbars) { - if (!foreignToolbars.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) && !myToolbars.contains(aBar)) { + myToolbars[aBar] = true; + myToolbarBreaks[aBar] = false; + aBar->setVisible(false); + aBar->toggleViewAction()->setVisible(false); } - //} + } 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 ); - // start timer to activate trace in a proper moment - if(!isStop) - startTimer( 1000 ); + bool isStop = aResourceMgr->booleanValue( PARAVIS_MODULE_NAME, "stop_trace", false ); + if(!isStop) + { + // Start a timer to schedule asap: + // - the trace start + myInitTimer = new QTimer(aDesktop); + QObject::connect(myInitTimer, SIGNAL(timeout()), this, SLOT(onInitTimer()) ); + myInitTimer->setSingleShot(true); + myInitTimer->start(0); + + // Another timer to regularly push the trace onto the engine: + myPushTraceTimer = new QTimer(aDesktop); + QObject::connect(myPushTraceTimer, SIGNAL(timeout()), this, SLOT(onPushTraceTimer()) ); + myPushTraceTimer->setSingleShot(false); + myPushTraceTimer->start(500); + } this->VTKConnect = vtkEventQtSlotConnect::New(); @@ -535,56 +434,35 @@ void PVGUI_Module::initialize( CAM_Application* app ) if(pvs) { vtkPVProgressHandler* ph = pvs->GetProgressHandler(); if(ph) { - this->VTKConnect->Connect(ph, vtkCommand::StartEvent, - this, SLOT(onStartProgress())); - this->VTKConnect->Connect(ph, vtkCommand::EndEvent, - this, SLOT(onEndProgress())); + this->VTKConnect->Connect(ph, vtkCommand::StartEvent, + this, SLOT(onStartProgress())); + this->VTKConnect->Connect(ph, vtkCommand::EndEvent, + this, SLOT(onEndProgress())); } } } - - connect(&pqActiveObjects::instance(), - SIGNAL(representationChanged(pqRepresentation*)), - this, SLOT(onRepresentationChanged(pqRepresentation*))); } +/*! + * \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() { @@ -594,73 +472,38 @@ 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; +/*! + \brief Initialisation timer event - Starts up the Python trace +*/ +void PVGUI_Module::onInitTimer() +{ + startTrace(); +} - /*//VTN: getRepresentation is protected - pqDataRepresentation* data = colorWidget->getRepresentation(); - - if( !data->getLookupTable() ) - return; +/*! + \brief Get list of embedded macros files +*/ +QStringList PVGUI_Module::getEmbeddedMacrosList() +{ + QString aRootDir = getenv("PARAVIS_ROOT_DIR"); - pqLookupTableManager* lut_mgr = pqApplicationCore::instance()->getLookupTableManager(); + QString aSourcePath = aRootDir + "/bin/salome/Macro"; - if(lut_mgr) { - lut_mgr->setScalarBarVisibility(data,visible); - } - */ - pqColorToolbar* colorTooBar = qobject_cast(colorWidget->parent()); - if( !colorTooBar ) - return; + QStringList aFilter; + aFilter << "*.py"; - pqScalarBarVisibilityReaction* scalarBarVisibility = colorTooBar->findChild(); - if(scalarBarVisibility) { - scalarBarVisibility->setScalarBarVisibility(visible); + QDir aSourceDir(aSourcePath); + QStringList aSourceFiles = aSourceDir.entryList(aFilter, QDir::Files); + QStringList aFullPathSourceFiles; + foreach (QString aMacrosName, aSourceFiles) { + aFullPathSourceFiles << aSourceDir.absoluteFilePath(aMacrosName); } + return aFullPathSourceFiles; } - /*! - \brief Launches a tracing of current server + \brief Update the list of embedded macros */ -void PVGUI_Module::timerEvent(QTimerEvent* te ) -{ -#ifndef WNT - PyInterp_Dispatcher* aDispatcher = PyInterp_Dispatcher::Get(); - if ( !aDispatcher->IsBusy() ) { - pqPythonManager* manager = qobject_cast - ( pqApplicationCore::instance()->manager( "PYTHON_MANAGER" ) ); - if ( manager ) { - pqPythonDialog* pyDiag = manager->pythonShellDialog(); - if ( pyDiag ) { - pqPythonShell* shell = pyDiag->shell(); - if ( shell ) { - QString script = "from paraview import smtrace\nsmtrace.start_trace()\n"; - shell->executeScript(script); - killTimer( te->timerId() ); - } - } - } - } -#endif -} - void PVGUI_Module::updateMacros() { pqPythonManager* aPythonManager = pqPVApplicationCore::instance()->pythonManager(); @@ -668,17 +511,8 @@ void PVGUI_Module::updateMacros() return; } - QString aRootDir = getenv("PARAVIS_ROOT_DIR"); - - QString aSourcePath = aRootDir + "/bin/salome/Macro"; - - QStringList aFilter; - aFilter << "*.py"; - - QDir aSourceDir(aSourcePath); - QStringList aSourceFiles = aSourceDir.entryList(aFilter, QDir::Files); - foreach (QString aStr, aSourceFiles) { - aPythonManager->addMacro(aSourcePath + "/" + aStr); + foreach (QString aStr, getEmbeddedMacrosList()) { + aPythonManager->addMacro(aStr); } } @@ -695,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 ); @@ -820,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) @@ -847,8 +611,6 @@ static void ParavisMessageOutput(QtMsgType type, const char *msg) } } - - /*! \brief Activate module. \param study current study @@ -861,14 +623,25 @@ bool PVGUI_Module::activateModule( SUIT_Study* study ) SUIT_ExceptionHandler::addCleanUpRoutine( paravisCleanUp ); - bool isDone = SalomeApp_Module::activateModule( study ); + storeCommonWindowsState(); + + 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 ); @@ -880,7 +653,7 @@ bool PVGUI_Module::activateModule( SUIT_Study* study ) for (int i = 0; i < anActns.size(); ++i) { QAction* a = anActns.at(i); if(a) - a->setVisible(true); + a->setVisible(true); } } @@ -907,13 +680,15 @@ bool PVGUI_Module::activateModule( SUIT_Study* study ) */ bool PVGUI_Module::deactivateModule( SUIT_Study* study ) { + MESSAGE("PARAVIS deactivation ...") + QMenu* aMenu = menuMgr()->findMenu( myRecentMenuId ); if(aMenu) { QList anActns = aMenu->actions(); for (int i = 0; i < anActns.size(); ++i) { QAction* a = anActns.at(i); if(a) - a->setVisible(false); + a->setVisible(false); } } @@ -933,7 +708,6 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study ) /*if (pqImplementation::helpWindow) { pqImplementation::helpWindow->hide(); }*/ - showView( false ); // hide menus menuMgr()->hide(myRecentMenuId); menuMgr()->hide(mySourcesMenuId); @@ -943,7 +717,6 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study ) setMenuShown( false ); setToolShown( false ); - saveDockWidgetsState(); SUIT_ExceptionHandler::removeCleanUpRoutine( paravisCleanUp ); @@ -951,7 +724,9 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study ) if (myOldMsgHandler) qInstallMsgHandler(myOldMsgHandler); - return SalomeApp_Module::deactivateModule( study ); + restoreCommonWindowsState(); + + return LightApp_Module::deactivateModule( study ); } @@ -965,16 +740,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) { deleteTemporaryFiles(); - MyCoreApp->deleteLater(); } 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. @@ -984,9 +772,10 @@ void PVGUI_Module::onApplicationClosed( SUIT_Application* theApp ) */ void PVGUI_Module::studyClosed(SUIT_Study* study) { + showView(false); clearParaviewState(); - SalomeApp_Module::studyClosed(study); + LightApp_Module::studyClosed(study); } /*! @@ -998,9 +787,9 @@ void PVGUI_Module::onModelOpened() if(!studyDS) { return; } - - _PTR(SComponent) paravisComp = - studyDS->FindComponent(PARAVIS::GetParavisGen(this)->ComponentDataType()); + + _PTR(SComponent) paravisComp = + studyDS->FindComponent(PARAVIS_MODULE_NAME); if(!paravisComp) { return; } @@ -1020,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 = PARAVIS::GetParavisGen(this)->GetIOR(); + CORBA::String_var anIOR = GetCPPEngine()->GetIOR(); return QString(anIOR.in()); } - /*! \brief Open file of format supported by ParaView */ @@ -1039,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 @@ -1053,46 +879,56 @@ void PVGUI_Module::executeScript(const char *script) #endif } +///** +// * Debug function printing out the given interpreter's execution context +// */ +//void printInterpContext(PyInterp_Interp * interp ) +//{ +// // Extract __smtraceString from interpreter's context +// const PyObject* ctxt = interp->getExecutionContext(); +// +// PyObject* lst = PyDict_Keys((PyObject *)ctxt); +// Py_ssize_t siz = PyList_GET_SIZE(lst); +// for (Py_ssize_t i = 0; i < siz; i++) +// { +// PyObject * elem = PyList_GetItem(lst, i); +// if (PyString_Check(elem)) +// { +// std::cout << "At pos:" << i << ", " << PyString_AsString(elem) << std::endl; +// } +// else +// std::cout << "At pos:" << i << ", not a string!" << std::endl; +// } +// Py_XDECREF(lst); +//} + /*! \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 - pqPythonManager* manager = qobject_cast( - pqApplicationCore::instance()->manager("PYTHON_MANAGER")); - if (manager) { - pqPythonDialog* pyDiag = manager->pythonShellDialog(); - if (pyDiag) { - pyDiag->runString("from paraview import smtrace\n" - "__smtraceString = smtrace.get_trace_string()\n"); - pyDiag->shell()->makeCurrent(); - 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; - } - pyDiag->shell()->releaseControl(); - } - } + 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; } @@ -1140,78 +976,6 @@ void PVGUI_Module::loadParaviewState(const char* theFileName) pqApplicationCore::instance()->loadState(theFileName, getActiveServer()); } -/*! - \brief Imports MED data from VISU module by data entry -*/ -void PVGUI_Module::onImportFromVisu(QString theEntry) -{ -#ifdef WITH_VISU - SUIT_OverrideCursor aWaitCursor; - - // get active study - SalomeApp_Study* activeStudy = dynamic_cast(application()->activeStudy()); - if(!activeStudy) return; - - // get SALOMEDS client study - _PTR(Study) aStudy = activeStudy->studyDS(); - if(!aStudy) return; - - // find VISU component in a study - _PTR(SComponent) aVisuComp = aStudy->FindComponent( "VISU" ); - if(!aVisuComp) return; - - // get SObject client by entry - _PTR(SObject) aSObj = aStudy->FindObjectID(qPrintable(theEntry)); - if (!aSObj) return; - - // get CORBA SObject - SALOMEDS_SObject* aSObject = _CAST(SObject, aSObj); - if ( !aSObject ) return; - - // load VISU engine - SALOME_NamingService* aNamingService = SalomeApp_Application::namingService(); - SALOME_LifeCycleCORBA aLCC(aNamingService); - - Engines::EngineComponent_var aComponent = aLCC.FindOrLoad_Component("FactoryServer","VISU"); - VISU::VISU_Gen_var aVISU = VISU::VISU_Gen::_narrow(aComponent); - if(CORBA::is_nil(aVISU)) return; - - _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder(); - aStudyBuilder->LoadWith( aVisuComp, SalomeApp_Application::orb()->object_to_string(aVISU) ); - - // get VISU result object - CORBA::Object_var aResultObject = aSObject->GetObject(); - if (CORBA::is_nil(aResultObject)) return; - VISU::Result_var aResult = VISU::Result::_narrow( aResultObject ); - if (CORBA::is_nil(aResult)) return; - - // export VISU result to the MED file - std::string aTmpDir = SALOMEDS_Tool::GetTmpDir(); - std::string aFileName = aSObject->GetName(); - std::string aFilePath = aTmpDir + aFileName; - - if (aResult->ExportMED(aFilePath.c_str())) { - openFile(aFilePath.c_str()); - myTemporaryFiles.append(QString(aFilePath.c_str())); - } -#else - MESSAGE("Visu module is not found."); -#endif -} - -/*! - \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 Returns current active ParaView server */ @@ -1222,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; @@ -1246,10 +1015,6 @@ void PVGUI_Module::createPreferences() aStrings<objectBrowser(); bool isOBClient = (ob && theClient == ob->popupClientType()); @@ -1272,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(PARAVIS::GetParavisGen(this)->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(); @@ -1295,28 +1060,28 @@ void PVGUI_Module::contextMenuPopup(const QString& theClient, QMenu* theMenu, QS } else { // Try to get state object - _PTR(SObject) stateSObj = - studyDS->FindObjectID(entry.toLatin1().constData()); + _PTR(SObject) stateSObj = + studyDS->FindObjectID(entry.toLatin1().constData()); if (!stateSObj) { - return; + return; } - + // Check local id _PTR(GenericAttribute) anAttr; if (!stateSObj->FindAttribute(anAttr, "AttributeLocalID")) { - return; + return; } _PTR(AttributeLocalID) anID(anAttr); - + if (anID->Value() == PVSTATEID) { - // Paraview state object - theMenu->addSeparator(); - theMenu->addAction(action(AddStatePopupId)); - theMenu->addAction(action(CleanAndAddStatePopupId)); - theMenu->addSeparator(); - theMenu->addAction(action(ParaVisRenameId)); - theMenu->addAction(action(ParaVisDeleteId)); + // Paraview state object + theMenu->addSeparator(); + theMenu->addAction(action(AddStatePopupId)); + theMenu->addAction(action(CleanAndAddStatePopupId)); + theMenu->addSeparator(); + theMenu->addAction(action(ParaVisRenameId)); + theMenu->addAction(action(ParaVisDeleteId)); } } } @@ -1342,31 +1107,8 @@ void PVGUI_Module::onShowTrace() */ void PVGUI_Module::onRestartTrace() { - PyInterp_Dispatcher* aDispatcher = PyInterp_Dispatcher::Get(); - if ( !aDispatcher->IsBusy() ) { - pqPythonManager* manager = qobject_cast - ( pqApplicationCore::instance()->manager( "PYTHON_MANAGER" ) ); - if ( manager ) { - pqPythonDialog* pyDiag = manager->pythonShellDialog(); - if ( pyDiag ) { - pqPythonShell* shell = pyDiag->shell(); - if ( shell ) { - QString script = "from paraview import smtrace\n"; - script += "smtrace.stop_trace()\n"; - script += "smtrace.start_trace()\n"; - shell->executeScript(script); - } - } - } - } -} - -/*! - \brief Show ParaView view. -*/ -void PVGUI_Module::onNewParaViewWindow() -{ - showView(true); + stopTrace(); + startTrace(); } /*! @@ -1381,9 +1123,9 @@ void PVGUI_Module::onSaveMultiState() if(!studyDS) { return; } - + _PTR(SComponent) paravisComp = - studyDS->FindComponent(PARAVIS::GetParavisGen(this)->ComponentDataType()); + studyDS->FindComponent(PARAVIS_MODULE_NAME); if(!paravisComp) { return; } @@ -1418,8 +1160,7 @@ void PVGUI_Module::onSaveMultiState() // File name for state saving QString tmpDir = QString::fromStdString(SALOMEDS_Tool::GetTmpDir()); - QString fileName = QString("%1_paravisstate:%2").arg(tmpDir, - stateEntry); + QString fileName = QString("%1_paravisstate:%2").arg(tmpDir, stateEntry); anAttr = studyBuilder->FindOrCreateAttribute(newSObj, "AttributeString"); _PTR(AttributeString) stringAttr(anAttr); @@ -1491,10 +1232,10 @@ void PVGUI_Module::onRename() if (stateSObj->FindAttribute(anAttr, "AttributeName")) { _PTR(AttributeName) nameAttr (anAttr); QString newName = - LightApp_NameDlg::getName(getApp()->desktop(), nameAttr->Value().c_str()); + LightApp_NameDlg::getName(getApp()->desktop(), nameAttr->Value().c_str()); if (!newName.isEmpty()) { - nameAttr->SetValue(newName.toLatin1().constData()); - aListIO.First()->setName(newName.toLatin1().constData()); + nameAttr->SetValue(newName.toLatin1().constData()); + aListIO.First()->setName(newName.toLatin1().constData()); } } @@ -1548,6 +1289,15 @@ 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..."); + GetEngine()->PutPythonTraceStringToEngine(getTraceString().toStdString().c_str()); +} + /*! \brief Discover help project files from the resources. \return name of the help file. @@ -1604,7 +1354,7 @@ void PVGUI_Module::loadSelectedState(bool toClear) QString stringValue(aStringAttr->Value().c_str()); if (QFile::exists(stringValue)) { - fileName = stringValue; + fileName = stringValue; } } } @@ -1618,29 +1368,11 @@ void PVGUI_Module::loadSelectedState(bool toClear) } else { SUIT_MessageBox::critical(getApp()->desktop(), - tr("ERR_ERROR"), - tr("ERR_STATE_CANNOT_BE_RESTORED")); - } -} - -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 ); - } + tr("ERR_ERROR"), + tr("ERR_STATE_CANNOT_BE_RESTORED")); } } - /*! \fn CAM_Module* createModule(); \brief Export module instance (factory function). @@ -1657,15 +1389,10 @@ extern "C" { bool flag = false; PVGUI_EXPORT CAM_Module* createModule() { - if(!flag) { - vtkEDFHelperInit(); - flag = true; - } return new PVGUI_Module(); } PVGUI_EXPORT char* getModuleVersion() { return (char*)PARAVIS_VERSION_STR; } - }