// PARAVIS : ParaView wrapper SALOME module
//
-// Copyright (C) 2010-2012 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
// 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 <Standard_math.hxx> // E.A. must be included before Python.h to fix compilation on windows
#ifdef HAVE_FINITE
#include <vtkPython.h> // 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 <utilities.h>
#include <SUIT_DataBrowser.h>
#include <SUIT_Desktop.h>
#include <SUIT_MessageBox.h>
#include <SUIT_OverrideCursor.h>
#include <SUIT_ExceptionHandler.h>
-// SALOME Includes
-#include "SALOME_LifeCycleCORBA.hxx"
-#include "SALOMEDS_SObject.hxx"
-
-#include "LightApp_SelectionMgr.h"
-#include "LightApp_NameDlg.h"
+#include <SALOME_LifeCycleCORBA.hxx>
+#include <SALOMEDS_SObject.hxx>
-#include <SalomeApp_Application.h>
+#include <LightApp_SelectionMgr.h>
+#include <LightApp_NameDlg.h>
+#include <LightApp_Application.h>
+#include <SalomeApp_Application.h> // should ultimately be a LightApp only
#include <SalomeApp_Study.h>
#include <SALOME_ListIO.hxx>
#include <SALOMEDS_Tool.hxx>
-#include <PyInterp_Dispatcher.h>
+#include <Utils_ORB_INIT.hxx>
+#include <Utils_SINGLETON.hxx>
#include <QtxActionMenuMgr.h>
#include <QtxActionToolMgr.h>
+#include <PARAVIS_version.h>
+
+// External includes
+#include <sstream>
+
#include <QAction>
#include <QApplication>
#include <QCursor>
#include <QDockWidget>
#include <QHelpEngine>
+// Paraview includes
+#include <vtkPVConfig.h> // for symbol PARAVIEW_VERSION
+#include <vtkProcessModule.h>
+#include <vtkPVSession.h>
+#include <vtkPVProgressHandler.h>
+#include <vtkOutputWindow.h>
+#include <vtkEventQtSlotConnect.h>
+#include <vtkNew.h>
+#include <vtkSMProxy.h>
+#include <vtkSmartPointer.h>
+#include <vtkSMSession.h>
+#include <vtkSMTrace.h>
+#include <vtkSMSessionProxyManager.h>
+#include <vtkSMParaViewPipelineController.h>
+
#include <pqApplicationCore.h>
#include <pqPVApplicationCore.h>
-#include <pqActiveView.h>
#include <pqObjectBuilder.h>
#include <pqOptions.h>
-#include <pqRenderView.h>
+#include <pqSettings.h>
#include <pqServer.h>
#include <pqUndoStack.h>
-#include <pqVCRController.h>
#include <pqTabbedMultiViewWidget.h>
-#include <pqPipelineSource.h>
#include <pqActiveObjects.h>
-#include <vtkProcessModule.h>
-#include <vtkSMSession.h>
-#include <vtkPVProgressHandler.h>
-#include <pqParaViewBehaviors.h>
#include <pqHelpReaction.h>
-#include <vtkOutputWindow.h>
#include <pqPluginManager.h>
-//#include <vtkPVPluginInformation.h>
-#include "pqInterfaceTracker.h"
-#include <pqSettings.h>
#include <pqPythonDialog.h>
#include <pqPythonManager.h>
-#include <pqPythonShell.h>
-//#include <pqBrandPluginsLoader.h>
#include <pqLoadDataReaction.h>
-#include <vtkEventQtSlotConnect.h>
#include <pqPythonScriptEditor.h>
-#include <pqStandardSummaryPanelImplementation.h>
-#include <pqCollaborationBehavior.h>
#include <pqDataRepresentation.h>
-#include <pqPipelineRepresentation.h>
-#include <pqLookupTableManager.h>
#include <pqDisplayColorWidget.h>
#include <pqColorToolbar.h>
#include <pqScalarBarVisibilityReaction.h>
-#include <pqStandardPropertyWidgetInterface.h>
-#include <pqMultiServerBehavior.h>
-#include <pqViewStreamingBehavior.h>
-
-#include <PARAVIS_version.h>
-
-#include <vtkPVConfig.h>
-
-#include <PVGUI_MatplotlibMathTextUtilities.h>
-
-#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 <vtkCommonInstantiator.h>
-//#include <vtkFilteringInstantiator.h>
-//#include <vtkGenericFilteringInstantiator.h>
-//#include <vtkIOInstantiator.h>
-//#include <vtkImagingInstantiator.h>
-//#include <vtkInfovisInstantiator.h>
-//#include <vtkGraphicsInstantiator.h>
-
-//#include <vtkRenderingInstantiator.h>
-//#include <vtkVolumeRenderingInstantiator.h>
-//#include <vtkHybridInstantiator.h>
-//#include <vtkParallelInstantiator.h>
-
-#include <pqAlwaysConnectedBehavior.h>
-#include <pqApplicationCore.h>
-#include <pqAutoLoadPluginXMLBehavior.h>
-#include <pqCommandLineOptionsBehavior.h>
-#include <pqCrashRecoveryBehavior.h>
-#include <pqDataTimeStepBehavior.h>
-#include <pqDefaultViewBehavior.h>
-#include <pqDeleteBehavior.h>
-#include <pqObjectPickingBehavior.h>
-#include <pqPersistentMainWindowStateBehavior.h>
-#include <pqPipelineContextMenuBehavior.h>
-#include <pqPluginActionGroupBehavior.h>
-#include <pqPluginDockWidgetsBehavior.h>
+#include <pqServerResource.h>
+#include <pqServerConnectReaction.h>
#include <pqPluginManager.h>
-#include <pqPVNewSourceBehavior.h>
-#include <pqSpreadSheetVisibilityBehavior.h>
-#include <pqStandardViewModules.h>
-#include <pqUndoRedoBehavior.h>
-#include <pqViewFrameActionsBehavior.h>
-#include <pqServerManagerObserver.h>
-
-#include <vtkClientServerInterpreterInitializer.h>
-
+#include <pqVCRToolbar.h>
+#include <pqAnimationScene.h>
+#include <pqServerManagerModel.h>
+#include <pqAnimationTimeToolbar.h>
//----------------------------------------------------------------------------
-pqPVApplicationCore* PVGUI_Module::MyCoreApp = 0;
-//PVGUI_OutputWindowAdapter* PVGUI_Module::pqImplementation::OutputWindowAdapter = 0;
-//QPointer<pqHelpWindow> 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 <a href="../index.html">Sphinx documentation</a> first.
- <h2>Building and installing PARAVIS</h2>
- As any other SALOME module, PARAVIS requires PARAVIS_ROOT_DIR environment variable to be set to PARAVIS
- installation directory.
- Other variables needed for correct detection of ParaView location:
- \li PVHOME - points at the ParaView installation directory tree
- \li PVVERSION - number of ParaView version
-
- It also requires common SALOME environment including GUI_ROOT_DIR and other prerequsites.
-
-
- PARAVIS module can be launched using the following commands:
- \li Full SALOME configuration
- \code
- runSalome --modules="PARAVIS"
- \endcode
-
- <h2>ParaView GUI integration</h2>
- <h3>ParaView GUI integration overview</h3>
-
- The main idea is to reuse ParaView GUI internal logic as much as possible, providing a layer
- between it and SALOME GUI that hides the following SALOME GUI implementation details from ParaView:
-
- \li SALOME GUI executable and Qt event loop
- \li SALOME GUI desktop
- \li Dock windows areas
- \li SALOME menu and toolbar managers
-
- Major part of the integration is implemented in PVGUI_Module class.
-
- <h3>ParaView client initalization</h3>
-
- ParaView client initalization is performed when an instance of PVGUI_Module class has been created
- and \link PVGUI_Module::initialize() PVGUI_Module::initialize()\endlink method is called by SALOME GUI.
- The actual client start-up is done in \link PVGUI_Module::pvInit() PVGUI_Module::pvInit()\endlink method.
-
-
- <h3>Multi-view manager</h3>
-
- SALOME GUI requires that each kind of view be implemnted with help of (at least) three classes. For ParaView multi-view manager
- these are:
-
- \li PVGUI_ViewManager - view manager class
- \li PVGUI_Viewer - view model class
- \li PVGUI_ViewWindow - view window class that acts as a parent for %pqViewManager
-
- Single instances of PVGUI_ViewManager and PVGUI_ViewWindow classes are created by \link PVGUI_Module::showView()
- PVGUI_Module::showView()\endlink method upon the first PARAVIS module activation. The same method hides the multi-view manager
- when the module is deactivated (the user switches to another module or a study is closed).
- A special trick is used to make PVGUI_ViewWindow the parent of %pqViewManager widget. It is created initally by %pqMainWindowCore
- with the desktop as a parent, so when it is shown PVGUI_ViewWindow instance is passed to its setParent() method. In
- \link PVGUI_ViewWindow::~PVGUI_ViewWindow() PVGUI_ViewWindow::~PVGUI_ViewWindow()\endlink the parent is nullified to avoid deletion
- of %pqViewManager widget that would break %pqMainWindowCore class.
-
- <h3>ParaView plugins</h3>
- ParaView server and client plugins are managed by %pqMainWindowCore slots that has full access to PARAVIS menus and toolbars.
- As a result they appears automatically in PARAVIS menus and toolbars if loaded successfully.
+ The integration of ParaView into SALOME is split in two parts:
+ \li the PVViewer in the GUI module (folder *src/PVViewer*)
+ \li the ParaVis module itself (the pages you are currently browsing)
*/
/*!
SALOME module wrapping ParaView GUI.
*/
+_PTR(SComponent)
+ClientFindOrCreateParavisComponent(_PTR(Study) theStudyDocument)
+{
+ _PTR(SComponent) aSComponent = theStudyDocument->FindComponent("PVSERVER");
+ if (!aSComponent) {
+ _PTR(StudyBuilder) aStudyBuilder = theStudyDocument->NewBuilder();
+ aStudyBuilder->NewCommand();
+ int aLocked = theStudyDocument->GetProperties()->IsLocked();
+ if (aLocked) theStudyDocument->GetProperties()->SetLocked(false);
+ aSComponent = aStudyBuilder->NewComponent("PVSERVER");
+ _PTR(GenericAttribute) anAttr =
+ aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeName");
+ _PTR(AttributeName) aName (anAttr);
+
+ ORB_INIT& init = *SINGLETON_<ORB_INIT>::Instance();
+ CORBA::ORB_var anORB = init( qApp->argc(), qApp->argv() );
+
+ SALOME_NamingService *NamingService = new SALOME_NamingService( anORB );
+ CORBA::Object_var objVarN = NamingService->Resolve("/Kernel/ModulCatalog");
+ SALOME_ModuleCatalog::ModuleCatalog_var Catalogue =
+ SALOME_ModuleCatalog::ModuleCatalog::_narrow(objVarN);
+ SALOME_ModuleCatalog::Acomponent_var Comp = Catalogue->GetComponent( "PVSERVER" );
+ if (!Comp->_is_nil()) {
+ aName->SetValue(Comp->componentusername());
+ }
-/*
- 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()
\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 ),
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);
+ }
}
}
*/
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.
*/
void PVGUI_Module::initialize( CAM_Application* app )
{
- //VTN: Disable conflict with python initialization for MatPlot.
- PVGUI_MatplotlibMathTextUtilities::Disable();
+ LightApp_Module::initialize( app );
- SalomeApp_Module::initialize( app );
-
- // Create ParaViS actions
createActions();
- // Create ParaViS menus
createMenus();
// Uncomment to debug ParaView initialization
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<QToolBar*> foreignToolbars = aDesktop->findChildren<QToolBar*>();
- // Remember current state of desktop toolbars
- QList<QToolBar*> foreignToolbars = aDesktop->findChildren<QToolBar*>();
+ // Initialize ParaView client and associated behaviors
+ // and connect to externally launched pvserver
+ PVViewer_ViewManager::ParaviewInitApp(aDesktop, anApp->logWindow());
+ myGuiElements = PVViewer_GUIElements::GetInstance(aDesktop);
- // 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();
-
- // 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()));
- QShortcut *altSpace = new QShortcut(Qt::ALT + Qt::Key_Space, aDesktop);
- QObject::connect(altSpace, SIGNAL(activated()),
- pqApplicationCore::instance(), SLOT(quickLaunch()));
- // End pqParaViewBehaviors
-
-
- 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");
- }
-
- // Force creation of engine
- PARAVIS::GetParavisGen(this);
- updateObjBrowser();
+ pvCreateActions();
+ pvCreateMenus();
+ pvCreateToolBars();
- // Find created toolbars
- QCoreApplication::processEvents();
+ PVViewer_ViewManager::ParaviewInitBehaviors(true, aDesktop);
- QList<QToolBar*> allToolbars = aDesktop->findChildren<QToolBar*>();
- foreach(QToolBar* aBar, allToolbars) {
- if (!foreignToolbars.contains(aBar)) {
- myToolbars[aBar] = true;
- myToolbarBreaks[aBar] = false;
- aBar->setVisible(false);
- aBar->toggleViewAction()->setVisible(false);
- }
+ QList<QDockWidget*> activeDocks = aDesktop->findChildren<QDockWidget*>();
+ QList<QMenu*> activeMenus = aDesktop->findChildren<QMenu*>();
+
+ // 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<QDockWidget*> currentDocks = aDesktop->findChildren<QDockWidget*>();
+ QList<QDockWidget*>::iterator i;
+ for (i = currentDocks.begin(); i != currentDocks.end(); ++i) {
+ if(!activeDocks.contains(*i)) {
+ myDockWidgets[*i] = false; // hidden by default
+ (*i)->hide();
}
- //}
+ }
- updateMacros();
-
- // we need to start trace after connection is done
- connect(pqApplicationCore::instance()->getObjectBuilder(), SIGNAL(finishedAddingServer(pqServer*)),
- this, SLOT(onFinishedAddingServer(pqServer*)));
+ // Find Plugin Menus
+ // [ABN] TODO: fix this - triggers a SEGFAULT at deactivation() time.
+// QList<QMenu*> currentMenus = aDesktop->findChildren<QMenu*>();
+// QList<QMenu*>::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();
- connect(pqApplicationCore::instance()->getObjectBuilder(), SIGNAL(dataRepresentationCreated(pqDataRepresentation*)),
- this, SLOT(onDataRepresentationCreated(pqDataRepresentation*)));
+ // Find created toolbars
+ QCoreApplication::processEvents();
+
+ // process PVViewer toolbars (might be added by PVViewer created BEFORE activating ParaVis)
+ QList<QToolBar*> pvToolbars = myGuiElements->getToolbars();
+ foreach(QToolBar* aBar, pvToolbars) {
+ if (!myToolbars.contains(aBar)) {
+ myToolbars[aBar] = true;
+ myToolbarBreaks[aBar] = false;
+ aBar->setVisible(false);
+ aBar->toggleViewAction()->setVisible(false);
+ }
+ }
+ // process other toolbars (possibly added by Paraview)
+ QList<QToolBar*> allToolbars = aDesktop->findChildren<QToolBar*>();
+ foreach(QToolBar* aBar, allToolbars) {
+ if (!foreignToolbars.contains(aBar) && !myToolbars.contains(aBar)) {
+ myToolbars[aBar] = true;
+ myToolbarBreaks[aBar] = false;
+ aBar->setVisible(false);
+ aBar->toggleViewAction()->setVisible(false);
+ }
+ }
+ updateMacros();
+
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( 50 );
+ 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();
+
vtkProcessModule* pm = vtkProcessModule::GetProcessModule();
-
- this->VTKConnect->Connect(pm, vtkCommand::StartEvent,
- this, SLOT(onStartProgress()));
- this->VTKConnect->Connect(pm, vtkCommand::EndEvent,
- this, SLOT(onEndProgress()));
-
- connect(&pqActiveObjects::instance(),
- SIGNAL(representationChanged(pqRepresentation*)),
- this, SLOT(onRepresentationChanged(pqRepresentation*)));
+ if(pm) {
+ vtkPVSession* pvs = dynamic_cast<vtkPVSession*>(pm->GetSession());
+ 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()));
+ }
+ }
+ }
}
+/*!
+ * \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( 50 );
-}
-
-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() {
activeStudy->Modified();
}
-void PVGUI_Module::onVariableChanged(pqVariableType t, const QString) {
-
- pqDisplayColorWidget* colorWidget = qobject_cast<pqDisplayColorWidget*>(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<pqColorToolbar*>(colorWidget->parent());
- if( !colorTooBar )
- return;
+ QStringList aFilter;
+ aFilter << "*.py";
- pqScalarBarVisibilityReaction* scalarBarVisibility = colorTooBar->findChild<pqScalarBarVisibilityReaction *>();
- 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<pqPythonManager*>
- ( 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();
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);
}
}
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<PVGUI_ViewManager*>( anApp->getViewManager( PVGUI_Viewer::Type(), false ) );
+ LightApp_Application* anApp = getApp();
+ PVViewer_ViewManager* viewMgr =
+ dynamic_cast<PVViewer_ViewManager*>( 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<PVGUI_ViewWindow*>( viewMgr->getActiveView() );
+ PVViewer_ViewWindow* pvWnd = dynamic_cast<PVViewer_ViewWindow*>( viewMgr->getActiveView() );
if ( !pvWnd ) {
- pvWnd = dynamic_cast<PVGUI_ViewWindow*>( viewMgr->createViewWindow() );
+ pvWnd = dynamic_cast<PVViewer_ViewWindow*>( viewMgr->createViewWindow() );
+ // this also connects to the pvserver and instantiates relevant PV behaviors
}
pvWnd->setShown( toShow );
}
/*!
- \brief Returns the ParaView multi-view manager.
+ \brief Handler method for the output of messages.
*/
-pqTabbedMultiViewWidget* PVGUI_Module::getMultiViewManager() const
-{
- return qobject_cast<pqTabbedMultiViewWidget*>(pqApplicationCore::instance()->manager("MULTIVIEW_WIDGET"));
-}
-
-
static void ParavisMessageOutput(QtMsgType type, const char *msg)
{
switch(type)
}
}
-
-
/*!
\brief Activate module.
\param study current 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 );
restoreDockWidgetsState();
- QMenu* aMenu = menuMgr()->findMenu( myRecentMenuId );
- if(aMenu) {
- QList<QAction*> anActns = aMenu->actions();
- for (int i = 0; i < anActns.size(); ++i) {
- QAction* a = anActns.at(i);
- if(a)
- a->setVisible(true);
- }
+ QMenu* aMenu = menuMgr()->findMenu( myRecentMenuId );
+ if(aMenu) {
+ QList<QAction*> anActns = aMenu->actions();
+ for (int i = 0; i < anActns.size(); ++i) {
+ QAction* a = anActns.at(i);
+ if(a)
+ a->setVisible(true);
}
+ }
+
+ QList<QMenu*>::iterator it;
+ for (it = myMenus.begin(); it != myMenus.end(); ++it) {
+ QAction* a = (*it)->menuAction();
+ if(a)
+ a->setVisible(true);
+ }
if ( myRecentMenuId != -1 ) menuMgr()->show(myRecentMenuId);
*/
bool PVGUI_Module::deactivateModule( SUIT_Study* study )
{
- QMenu* aMenu = menuMgr()->findMenu( myRecentMenuId );
- if(aMenu) {
- QList<QAction*> anActns = aMenu->actions();
- for (int i = 0; i < anActns.size(); ++i) {
- QAction* a = anActns.at(i);
- if(a)
- a->setVisible(false);
- }
+ MESSAGE("PARAVIS deactivation ...")
+
+ QMenu* aMenu = menuMgr()->findMenu( myRecentMenuId );
+ if(aMenu) {
+ QList<QAction*> anActns = aMenu->actions();
+ for (int i = 0; i < anActns.size(); ++i) {
+ QAction* a = anActns.at(i);
+ if(a)
+ a->setVisible(false);
}
+ }
+
+ QList<QMenu*>::iterator it;
+ for (it = myMenus.begin(); it != myMenus.end(); ++it) {
+ QAction* a = (*it)->menuAction();
+ if(a)
+ a->setVisible(false);
+ }
QList<QDockWidget*> aStreamingViews = application()->desktop()->findChildren<QDockWidget*>("pqStreamingControls");
foreach(QDockWidget* aView, aStreamingViews) {
/*if (pqImplementation::helpWindow) {
pqImplementation::helpWindow->hide();
}*/
- showView( false );
// hide menus
menuMgr()->hide(myRecentMenuId);
menuMgr()->hide(mySourcesMenuId);
setMenuShown( false );
setToolShown( false );
-
saveDockWidgetsState();
SUIT_ExceptionHandler::removeCleanUpRoutine( paravisCleanUp );
if (myOldMsgHandler)
qInstallMsgHandler(myOldMsgHandler);
- return SalomeApp_Module::deactivateModule( study );
+ restoreCommonWindowsState();
+
+ return LightApp_Module::deactivateModule( 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.
*/
void PVGUI_Module::studyClosed(SUIT_Study* study)
{
+ showView(false);
clearParaviewState();
- SalomeApp_Module::studyClosed(study);
+ LightApp_Module::studyClosed(study);
}
/*!
if(!studyDS) {
return;
}
-
- _PTR(SComponent) paravisComp =
- studyDS->FindComponent(PARAVIS::GetParavisGen(this)->ComponentDataType());
+
+ _PTR(SComponent) paravisComp =
+ studyDS->FindComponent(PARAVIS_MODULE_NAME);
if(!paravisComp) {
return;
}
}
/*!
- \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
*/
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<vtkSMProxy> proxy;
+ proxy.TakeReference(pxm->NewProxy("pythontracing", "PythonTraceOptions"));
+ if (proxy)
+ {
+ vtkNew<vtkSMParaViewPipelineController> 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
#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<pqPythonManager*>(
- 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;
}
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<SalomeApp_Study*>(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
*/
/*!
- \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<QVariant> aIndices;
QStringList aStrings;
aIndices<<0<<1<<2;
aStrings<<tr("PREF_SAVE_TYPE_2");
setPreferenceProperty(aSaveType, "strings", aStrings);
setPreferenceProperty(aSaveType, "indexes", aIndices);
-
- //rnv: imp 21712: [CEA 581] Preference to display legend by default
- int aDispColoreLegend = addPreference( tr( "PREF_SHOW_COLOR_LEGEND" ), aParaVisSettingsTab,
- LightApp_Preferences::Bool, "PARAVIS", "show_color_legend");
}
/*!
*/
void PVGUI_Module::contextMenuPopup(const QString& theClient, QMenu* theMenu, QString& theTitle)
{
- SalomeApp_Module::contextMenuPopup(theClient, theMenu, theTitle);
-
+ LightApp_Module::contextMenuPopup(theClient, theMenu, theTitle);
+
// Check if we are in Object Browser
SUIT_DataBrowser* ob = getApp()->objectBrowser();
bool isOBClient = (ob && theClient == ob->popupClientType());
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<SalomeApp_Study*>(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();
}
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));
}
}
}
}
+/*!
+ \brief. Show ParaView python trace.
+*/
void PVGUI_Module::onShowTrace()
{
if (!myTraceWindow) {
myTraceWindow->activateWindow();
}
+
/*!
- \brief Show ParaView view.
+ \brief. Re-initialize ParaView python trace.
*/
-void PVGUI_Module::onNewParaViewWindow()
+void PVGUI_Module::onRestartTrace()
{
- showView(true);
+ stopTrace();
+ startTrace();
}
/*!
if(!studyDS) {
return;
}
-
+
_PTR(SComponent) paravisComp =
- studyDS->FindComponent(PARAVIS::GetParavisGen(this)->ComponentDataType());
+ studyDS->FindComponent(PARAVIS_MODULE_NAME);
if(!paravisComp) {
return;
}
// 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);
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());
}
}
}
}
+/*!
+ * \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.
QString stringValue(aStringAttr->Value().c_str());
if (QFile::exists(stringValue)) {
- fileName = stringValue;
+ fileName = stringValue;
}
}
}
}
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<pqDisplayColorWidget*> aWidget = getApp()->desktop()->findChildren<pqDisplayColorWidget*>();
-
- 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).
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;
}
-
}