X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FPVGUI%2FPVGUI_Module.cxx;h=f0a6473a99926189cab776037946cb52af71db36;hb=45730a713833b123768d9e895d06ffd86bca71d0;hp=28cc1c4af99b2f48da9065a43e6b602a8cb668b0;hpb=c6b8ca4137b966ea0b1e5a80b7d84a742a8ebc4d;p=modules%2Fparavis.git diff --git a/src/PVGUI/PVGUI_Module.cxx b/src/PVGUI/PVGUI_Module.cxx index 28cc1c4a..f0a6473a 100644 --- a/src/PVGUI/PVGUI_Module.cxx +++ b/src/PVGUI/PVGUI_Module.cxx @@ -23,19 +23,41 @@ // Author : Julia DOROVSKIKH // +#include // Python first #include "PVGUI_Module.h" + +#include "SALOMEconfig.h" +#include CORBA_CLIENT_HEADER(VISU_Gen) +#include CORBA_SERVER_HEADER(SALOMEDS) + + +#include "PARAVIS_Gen_i.hh" + #include "PVGUI_Module_impl.h" -#include "PVGUI_ProcessModuleHelper.h" #include "PVGUI_ViewModel.h" #include "PVGUI_ViewManager.h" #include "PVGUI_ViewWindow.h" +#include "PVGUI_Tools.h" +//#include "PVGUI_Trace.h" #include #include #include #include -#include +#include + +// SALOME Includes +#include "SALOME_LifeCycleCORBA.hxx" +#include "SALOME_ListIteratorOfListIO.hxx" +#include "SALOMEDS_SObject.hxx" + #include +#include +#include +#include +#include +#include + #include #include @@ -52,23 +74,32 @@ #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 "pqBrandPluginsLoader.h" +#include /* * Make sure all the kits register their classes with vtkInstantiator. @@ -90,59 +121,97 @@ #include #include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include //---------------------------------------------------------------------------- -// ClientServer wrapper initialization functions. -// Taken from ParaView sources (file pqMain.cxx) -extern "C" void vtkCommonCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkFilteringCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkGenericFilteringCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkImagingCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkInfovisCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkGraphicsCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkIOCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkRenderingCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkVolumeRenderingCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkHybridCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkWidgetsCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkParallelCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkPVServerCommonCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkPVFiltersCS_Initialize(vtkClientServerInterpreter*); -extern "C" void vtkXdmfCS_Initialize(vtkClientServerInterpreter *); +pqApplicationCore* PVGUI_Module::pqImplementation::Core = 0; +PVGUI_OutputWindowAdapter* PVGUI_Module::pqImplementation::OutputWindowAdapter = 0; +QPointer PVGUI_Module::pqImplementation::helpWindow = 0; -//---------------------------------------------------------------------------- -void ParaViewInitializeInterpreter(vtkProcessModule* pm) -{ - // Initialize built-in wrapper modules. - vtkCommonCS_Initialize(pm->GetInterpreter()); - vtkFilteringCS_Initialize(pm->GetInterpreter()); - vtkGenericFilteringCS_Initialize(pm->GetInterpreter()); - vtkImagingCS_Initialize(pm->GetInterpreter()); - vtkInfovisCS_Initialize(pm->GetInterpreter()); - vtkGraphicsCS_Initialize(pm->GetInterpreter()); - vtkIOCS_Initialize(pm->GetInterpreter()); - vtkRenderingCS_Initialize(pm->GetInterpreter()); - vtkVolumeRenderingCS_Initialize(pm->GetInterpreter()); - vtkHybridCS_Initialize(pm->GetInterpreter()); - vtkWidgetsCS_Initialize(pm->GetInterpreter()); - vtkParallelCS_Initialize(pm->GetInterpreter()); - vtkPVServerCommonCS_Initialize(pm->GetInterpreter()); - vtkPVFiltersCS_Initialize(pm->GetInterpreter()); - vtkXdmfCS_Initialize(pm->GetInterpreter()); -} +PVGUI_Module* ParavisModule = 0; + +/*! + \mainpage + +

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 -vtkPVMain* PVGUI_Module::pqImplementation::myPVMain = 0; -pqOptions* PVGUI_Module::pqImplementation::myPVOptions = 0; -PVGUI_ProcessModuleHelper* PVGUI_Module::pqImplementation::myPVHelper = 0; +

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. +*/ /*! \class PVGUI_Module - \brief Implementation of light (no-CORBA-engine) + \brief Implementation SALOME module wrapping ParaView GUI. */ @@ -150,12 +219,17 @@ PVGUI_ProcessModuleHelper* PVGUI_Module::pqImplementation::myPVHelper = 0; \brief Constructor. Sets the default name for the module. */ PVGUI_Module::PVGUI_Module() - : LightApp_Module( "PARAVIS" ), + : SalomeApp_Module( "PARAVIS" ), + LightApp_Module( "PARAVIS" ), Implementation( 0 ), mySelectionControlsTb( -1 ), mySourcesMenuId( -1 ), - myFiltersMenuId( -1 ) + myFiltersMenuId( -1 ), + myMacrosMenuId(-1), + myToolbarsMenuId(-1), + myOldMsgHandler(0) { + ParavisModule = this; } /*! @@ -165,13 +239,15 @@ PVGUI_Module::~PVGUI_Module() { } + + /*! \brief Initialize module. Creates menus, prepares context menu, etc. - \param app application instance + \param app SALOME GUI application instance */ void PVGUI_Module::initialize( CAM_Application* app ) { - LightApp_Module::initialize( app ); + SalomeApp_Module::initialize( app ); // Uncomment to debug ParaView initialization // "aa" used instead of "i" as GDB doesn't like "i" variables :) @@ -187,7 +263,7 @@ void PVGUI_Module::initialize( CAM_Application* app ) // Create GUI elements (menus, toolbars, dock widgets) if ( !Implementation ){ - LightApp_Application* anApp = getApp(); + SalomeApp_Application* anApp = getApp(); // Simulate ParaView client main window Implementation = new pqImplementation( anApp->desktop() ); @@ -195,16 +271,105 @@ void PVGUI_Module::initialize( CAM_Application* app ) setupDockWidgets(); pvCreateActions(); - pvCreateMenus(); 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(); + + // * adds support for standard paraview views. + pgm->addInterface(new pqStandardViewModules(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 pqDefaultViewBehavior(this); + new pqAlwaysConnectedBehavior(this); + new pqPVNewSourceBehavior(this); + new pqDeleteBehavior(this); + new pqUndoRedoBehavior(this); + new pqCrashRecoveryBehavior(this); + new pqAutoLoadPluginXMLBehavior(this); + new pqPluginDockWidgetsBehavior(getApp()->desktop()); + new pqPluginActionGroupBehavior(getApp()->desktop()); + new pqCommandLineOptionsBehavior(this); + new pqPersistentMainWindowStateBehavior(getApp()->desktop()); + + // Setup quick-launch shortcuts. + QShortcut *ctrlSpace = new QShortcut(Qt::CTRL + Qt::Key_Space, + getApp()->desktop()); + QObject::connect(ctrlSpace, SIGNAL(activated()), + pqApplicationCore::instance(), SLOT(quickLaunch())); + QShortcut *altSpace = new QShortcut(Qt::ALT + Qt::Key_Space, + getApp()->desktop()); + QObject::connect(altSpace, SIGNAL(activated()), + pqApplicationCore::instance(), SLOT(quickLaunch())); + // End pqParaViewBehaviors - setupDockWidgetsContextMenu(); + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + QString aPath = resMgr->stringValue("resources", "PARAVIS", QString()); + if (!aPath.isNull()) { + pqImplementation::Core->loadConfiguration(aPath + QDir::separator() + "ParaViewFilters.xml"); + pqImplementation::Core->loadConfiguration(aPath + QDir::separator() + "ParaViewReaders.xml"); + pqImplementation::Core->loadConfiguration(aPath + QDir::separator() + "ParaViewSources.xml"); + pqImplementation::Core->loadConfiguration(aPath + QDir::separator() + "ParaViewWriters.xml"); + } // Now that we're ready, initialize everything ... - Implementation->Core.initializeStates(); + + + // Force creation of engine + PARAVIS::GetParavisGen(this); + updateObjBrowser(); + } + + // Initialize list of toolbars + QCoreApplication::processEvents(); + QList aBars = getParaViewToolbars(); + foreach (QToolBar* aBar, aBars) { + myToolbarState[aBar] = true; + } + + SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr(); + bool isStop = aResourceMgr->booleanValue( "PARAVIS", "stop_trace", false ); + if(!isStop) + QTimer::singleShot(50, this, SLOT(activateTrace())); +} + + +void PVGUI_Module::activateTrace() +{ + PyInterp_Dispatcher* aDispatcher = PyInterp_Dispatcher::Get(); + if (aDispatcher->IsBusy()) { + QTimer::singleShot(50, this, SLOT(activateTrace())); + return; + } + + pqPythonDialog* pyDiag = 0; + pqPythonManager* manager = qobject_cast( + pqApplicationCore::instance()->manager("PYTHON_MANAGER")); + if (manager) { + pyDiag = manager->pythonShellDialog(); + } + if (pyDiag) { + pyDiag->runString("try:\n" + " from paraview import smtrace\n" + " smtrace.start_trace()\n" + " print 'Trace started.'\n" + "except: raise RuntimeError('could not import paraview.smtrace')\n"); } } + + /*! \brief Get list of compliant dockable GUI elements \param m map to be filled in ("type":"default_position") @@ -217,87 +382,76 @@ void PVGUI_Module::windows( QMap& m ) const m.insert( LightApp_Application::WT_LogWindow, Qt::BottomDockWidgetArea ); } -/*! - \brief Create custom popup menu selection object. - \return new selected object -*/ -/*LightApp_Selection* PVGUI_Module::createSelection() const -{ - return new PVGUI_Selection(); -}*/ - -/*! - \brief Create data model. - \return module specific data model -*/ -/*CAM_DataModel* PVGUI_Module::createDataModel() -{ - return new PVGUI_DataModel( this ); -}*/ - /*! \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::myPVMain ){ + if ( !pqImplementation::Core ){ // Obtain command-line arguments - // Workaround to avoid pqOptions messages: pass only the executable path to vtkPVMain int argc = 0; QStringList args = QApplication::arguments(); char** argv = new char*[args.size()]; - for ( QStringList::const_iterator it = args.begin(); argc < 1 && it != args.end(); it++, argc++ ) + for ( QStringList::const_iterator it = args.begin(); argc < 1 && it != args.end(); it++, argc++ ) { argv[argc] = strdup( (*it).toLatin1().constData() ); - - vtkPVMain::SetInitializeMPI(0); // pvClient never runs with MPI. - vtkPVMain::Initialize(&argc, &argv); // Perform any initializations. - - // TODO: Set plugin dir from preferences - //QApplication::setLibraryPaths(QStringList(dir.absolutePath())); - - pqImplementation::myPVMain = vtkPVMain::New(); - if ( !pqImplementation::myPVOptions ) - pqImplementation::myPVOptions = pqOptions::New(); - if ( !pqImplementation::myPVHelper ) - pqImplementation::myPVHelper = PVGUI_ProcessModuleHelper::New(); - - pqImplementation::myPVOptions->SetProcessType(vtkPVOptions::PVCLIENT); - - // This creates the Process Module and initializes it. - int ret = pqImplementation::myPVMain->Initialize(pqImplementation::myPVOptions, - pqImplementation::myPVHelper, - ParaViewInitializeInterpreter, - argc, argv); - if (!ret){ - // Tell process module that we support Multiple connections. - // This must be set before starting the event loop. - vtkProcessModule::GetProcessModule()->SupportMultipleConnectionsOn(); - ret = pqImplementation::myPVHelper->Run(pqImplementation::myPVOptions); } + pqImplementation::Core = new pqPVApplicationCore (argc, argv); + if (pqImplementation::Core->getOptions()->GetHelpSelected() || + pqImplementation::Core->getOptions()->GetUnknownArgument() || + pqImplementation::Core->getOptions()->GetErrorMessage() || + pqImplementation::Core->getOptions()->GetTellVersion()) { + return false; + } + // VSV: Code from Initializer - it seems that it does nothing + + // 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 + + //qInstallMsgHandler(0); // switch off standard Paraview message handler + pqImplementation::OutputWindowAdapter = PVGUI_OutputWindowAdapter::New(); + vtkOutputWindow::SetInstance(pqImplementation::OutputWindowAdapter); + //pqPluginManager* pgm = pqApplicationCore::instance()->getPluginManager(); + //pgm->loadExtensions(NULL); + + new pqViewManager(); // it registers as "MULTIVIEW_MANAGER on creation + + if (argc == 1) + free(argv[0]); // because in creation argc < 1 delete[] argv; - return !ret; } return true; } -/*! - \brief Static method, cleans up ParaView session at application exit. -*/ -void PVGUI_Module::pvShutdown() -{ - // TODO... -} - /*! \brief Shows (toShow = true) or hides ParaView view window */ void PVGUI_Module::showView( bool toShow ) { - LightApp_Application* anApp = getApp(); - PVGUI_ViewManager* viewMgr = dynamic_cast( anApp->getViewManager( PVGUI_Viewer::Type(), false ) ); + SalomeApp_Application* anApp = getApp(); + PVGUI_ViewManager* viewMgr = + dynamic_cast( anApp->getViewManager( PVGUI_Viewer::Type(), false ) ); if ( !viewMgr ) { viewMgr = new PVGUI_ViewManager( anApp->activeStudy(), anApp->desktop() ); anApp->addViewManager( viewMgr ); @@ -308,419 +462,421 @@ void PVGUI_Module::showView( bool toShow ) PVGUI_ViewWindow* pvWnd = dynamic_cast( viewMgr->getActiveView() ); if ( !pvWnd ) { pvWnd = dynamic_cast( viewMgr->createViewWindow() ); - pvWnd->setMultiViewManager( &Implementation->Core.multiViewManager() ); } pvWnd->setShown( toShow ); } -/*! - \brief Manage the label of Undo operation. -*/ -void PVGUI_Module::onUndoLabel( const QString& label ) -{ - action(UndoId)->setText( - label.isEmpty() ? tr("MEN_CANTUNDO") : QString(tr("MEN_UNDO_ACTION")).arg(label)); - action(UndoId)->setStatusTip( - label.isEmpty() ? tr("MEN_CANTUNDO") : QString(tr("MEN_UNDO_ACTION_TIP")).arg(label)); -} -/*! - \brief Manage the label of Redo operation. -*/ -void PVGUI_Module::onRedoLabel( const QString& label ) -{ - action(RedoId)->setText( - label.isEmpty() ? tr("MEN_CANTREDO") : QString(tr("MEN_REDO_ACTION")).arg(label)); - action(RedoId)->setStatusTip( - label.isEmpty() ? tr("MEN_CANTREDO") : QString(tr("MEN_REDO_ACTION_TIP")).arg(label)); -} +// void PVGUI_Module::connectToPlay() +// { +// connect( action(PlayId), SIGNAL( triggered() ), &Implementation->Core.VCRController(), SLOT( onPlay() ) ); +// } -/*! - \brief Manage the label of Undo Camera operation. -*/ -void PVGUI_Module::onCameraUndoLabel( const QString& label ) -{ - action(CameraUndoId)->setText( - label.isEmpty() ? tr("MEN_CANT_CAMERA_UNDO") : QString(tr("MEN_CAMERA_UNDO_ACTION")).arg(label)); - action(CameraUndoId)->setStatusTip( - label.isEmpty() ? tr("MEN_CANT_CAMERA_UNDO") : QString(tr("MEN_CAMERA_UNDO_ACTION_TIP")).arg(label)); -} /*! - \brief Manage the label of Redo Camera operation. + \brief Slot to show help for proxy. */ -void PVGUI_Module::onCameraRedoLabel( const QString& label ) +void PVGUI_Module::showHelpForProxy( const QString& proxy ) { - action(CameraRedoId)->setText( - label.isEmpty() ? tr("MEN_CANT_CAMERA_REDO") : QString(tr("MEN_CAMERA_REDO_ACTION")).arg(label)); - action(CameraRedoId)->setStatusTip( - label.isEmpty() ? tr("MEN_CANT_CAMERA_REDO") : QString(tr("MEN_CAMERA_REDO_ACTION_TIP")).arg(label)); + //pqHelpReaction::showHelp(QString("qthelp://paraview.org/paraview/%1.html").arg(proxy)); + showHelp(QString("qthelp://paraview.org/paraview/%1.html").arg(proxy)); } -/*! - \brief Slot to delete all objects. -*/ -void PVGUI_Module::onDeleteAll() +void PVGUI_Module::showParaViewHelp() { - pqObjectBuilder* builder = pqApplicationCore::instance()->getObjectBuilder(); - Implementation->Core.getApplicationUndoStack()->beginUndoSet("Delete All"); - builder->destroyPipelineProxies(); - Implementation->Core.getApplicationUndoStack()->endUndoSet(); + showHelp(QString()); } -/*! - \brief Slot to check/uncheck the action for corresponding selection mode. -*/ -void PVGUI_Module::onSelectionModeChanged( int mode ) +void PVGUI_Module::showHelp(const QString& url) { - if( toolMgr()->toolBar( mySelectionControlsTb )->isEnabled() ) { - if(mode == pqRubberBandHelper::SELECT) //surface selection - action(SelectCellsOnId)->setChecked(true); - else if(mode == pqRubberBandHelper::SELECT_POINTS) //surface selection - action(SelectPointsOnId)->setChecked(true); - else if(mode == pqRubberBandHelper::FRUSTUM) - action(SelectCellsThroughId)->setChecked(true); - else if(mode == pqRubberBandHelper::FRUSTUM_POINTS) - action(SelectPointsThroughId)->setChecked(true); - else if (mode == pqRubberBandHelper::BLOCKS) - action(SelectBlockId)->setChecked(true); - else // INTERACT - action(InteractId)->setChecked(true); + if (pqImplementation::helpWindow) { + // raise assistant window; + pqImplementation::helpWindow->show(); + pqImplementation::helpWindow->raise(); + if (!url.isEmpty()) { + pqImplementation::helpWindow->showPage(url); + } + return; + } + + // * Discover help project files from the resources. + QString aPVHome(getenv("PVHOME")); + if (aPVHome.isNull()) { + qWarning("Wariable PVHOME is not defined"); + return; + } + QChar aSep = QDir::separator(); + QString aFile = aPVHome + aSep + "doc" + aSep + "paraview.qch"; + + if (!QFile::exists(aFile)) { + qWarning("Help file do not found"); + return; + } + + pqImplementation::helpWindow = new pqHelpWindow(QString("ParaView Online Help"), getApp()->desktop()); + QString namespace_name = pqImplementation::helpWindow->registerDocumentation(aFile); + + pqImplementation::helpWindow->showHomePage(namespace_name); + pqImplementation::helpWindow->show(); + pqImplementation::helpWindow->raise(); + if (!url.isEmpty()) { + pqImplementation::helpWindow->showPage(url); } } + + /*! - \brief Slot to manage the change of axis center. + \brief Slot to show the waiting state. */ -void PVGUI_Module::onShowCenterAxisChanged( bool enabled ) +void PVGUI_Module::onPreAccept() { - action(ShowCenterId)->setEnabled(enabled); - action(ShowCenterId)->blockSignals(true); - pqRenderView* renView = qobject_cast( - pqActiveView::instance().current()); - action(ShowCenterId)->setChecked( renView ? renView->getCenterAxesVisibility() : false); - action(ShowCenterId)->blockSignals(false); + getApp()->desktop()->statusBar()->showMessage(tr("STB_PREACCEPT")); + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); } /*! - \brief Slot to set tooltips for the first anf the last frames, i.e. a time range of animation. + \brief Slot to show the ready state. */ -void PVGUI_Module::setTimeRanges( double start, double end ) +void PVGUI_Module::onPostAccept() { - action(FirstFrameId)->setToolTip(QString("First Frame (%1)").arg(start, 0, 'g')); - action(LastFrameId)->setToolTip(QString("Last Frame (%1)").arg(end, 0, 'g')); + getApp()->desktop()->statusBar()->showMessage(tr("STB_POSTACCEPT"), 2000); + QTimer::singleShot(0, this, SLOT(endWaitCursor())); } /*! - \brief Slot to manage the plaing process of animation. + \brief Slot to switch off wait cursor. */ -void PVGUI_Module::onPlaying( bool playing ) +void PVGUI_Module::endWaitCursor() { - SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); - if(playing) { - disconnect( action(PlayId), SIGNAL( triggered() ), - &Implementation->Core.VCRController(), SLOT( onPlay() ) ); - connect( action(PlayId), SIGNAL( triggered() ), - &Implementation->Core.VCRController(), SLOT( onPause() ) ); - action(PlayId)->setIcon(QIcon(resMgr->loadPixmap("ParaView",tr("ICON_PAUSE"),false))); - action(PlayId)->setText("Pa&use"); - } - else { - connect( action(PlayId), SIGNAL( triggered() ), - &Implementation->Core.VCRController(), SLOT( onPlay() ) ); - disconnect( action(PlayId), SIGNAL( triggered() ), - &Implementation->Core.VCRController(), SLOT( onPause() ) ); - action(PlayId)->setIcon(QIcon(resMgr->loadPixmap("ParaView",tr("ICON_PLAY"),false))); - action(PlayId)->setText("&Play"); - } - - Implementation->Core.setSelectiveEnabledState(!playing); + QApplication::restoreOverrideCursor(); } /*! - \brief Slot to add camera link. + \brief Returns the ParaView multi-view manager. */ -void PVGUI_Module::onAddCameraLink() +pqViewManager* PVGUI_Module::getMultiViewManager() const { - pqView* vm = pqActiveView::instance().current(); - pqRenderView* rm = qobject_cast(vm); - if(rm) rm->linkToOtherView(); - else SUIT_MessageBox::warning(getApp()->desktop(), - tr("WARNING"), tr("WRN_ADD_CAMERA_LINK")); + return qobject_cast(pqApplicationCore::instance()->manager("MULTIVIEW_MANAGER")); } -/*! - \brief Slot to show information about ParaView. -*/ -void PVGUI_Module::onHelpAbout() -{ - pqClientAboutDialog* const dialog = new pqClientAboutDialog(getApp()->desktop()); - dialog->setAttribute(Qt::WA_DeleteOnClose); - dialog->show(); + +static void ParavisMessageOutput(QtMsgType type, const char *msg) +{ + switch(type) + { + case QtDebugMsg: + vtkOutputWindow::GetInstance()->DisplayText(msg); + break; + case QtWarningMsg: + vtkOutputWindow::GetInstance()->DisplayErrorText(msg); + break; + case QtCriticalMsg: + vtkOutputWindow::GetInstance()->DisplayErrorText(msg); + break; + case QtFatalMsg: + vtkOutputWindow::GetInstance()->DisplayErrorText(msg); + break; + } } + + /*! - \brief Slot to show help for proxy. + \brief Activate module. + \param study current study + \return \c true if activaion is done successfully or 0 to prevent + activation on error */ -void PVGUI_Module::showHelpForProxy( const QString& proxy ) +bool PVGUI_Module::activateModule( SUIT_Study* study ) { - // make sure assistant is ready - this->makeAssistant(); - - if(this->Implementation->AssistantClient) { - this->Implementation->AssistantClient->openAssistant(); - QString page("%1/Documentation/%2.html"); - page = page.arg(this->Implementation->DocumentationDir); - page = page.arg(proxy); - this->Implementation->AssistantClient->showPage(page); - } -} + myOldMsgHandler = qInstallMsgHandler(ParavisMessageOutput); -QString Locate( const QString& appName ) -{ - QString app_dir = QCoreApplication::applicationDirPath(); - const char* inst_dirs[] = { - "/./", - "/../bin/", - "/../../bin/", - 0 - }; - for (const char** dir = inst_dirs; *dir; ++dir) { - QString path = app_dir; - path += *dir; - path += appName; - //cout << "Checking : " << path.toAscii().data() << " ... "; - //cout.flush(); - QFileInfo finfo (path); - if (finfo.exists()) { - //cout << " Success!" << endl; - return path; + bool isDone = SalomeApp_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); + setMenuShown( true ); + setToolShown( true ); + + if (myToolbarState.size() > 0) { + SUIT_Desktop* desk = application()->desktop(); + QList aToolbars = myToolbarState.keys(); + foreach(QToolBar* aBar, aToolbars) { + aBar->setParent(desk); + aBar->setVisible(myToolbarState[aBar]); } - //cout << " Failed" << endl; } - return app_dir + QDir::separator() + appName; + + restoreDockWidgetsState(); + + return isDone; } + /*! - \brief Initialized an assistant client. + \brief Deactivate module. + \param study current study + \return \c true if deactivaion is done successfully or 0 to prevent + deactivation on error */ -void PVGUI_Module::makeAssistant() +bool PVGUI_Module::deactivateModule( SUIT_Study* study ) { - if(this->Implementation->AssistantClient) - return; - - QString assistantExe; - QString profileFile; - - const char* assistantName = "assistant"; -#ifdef WNT - const char* binDir = "\\"; - const char* binDir1 = "\\..\\"; -#else - const char* binDir = "/bin/"; - const char* binDir1 = "/bin/bin/"; -#endif - - QString helper = QString(getenv("PVHOME")) + binDir + QString("pqClientDocFinder.txt"); - if(!QFile::exists(helper)) - helper = QString(getenv("PVHOME")) + binDir1 + QString("pqClientDocFinder.txt"); - if(QFile::exists(helper)) { - QFile file(helper); - if(file.open(QIODevice::ReadOnly)) { - assistantExe = file.readLine().trimmed(); - profileFile = file.readLine().trimmed(); - // CMake escapes spaces, we need to unescape those. - assistantExe.replace("\\ ", " "); - profileFile.replace("\\ ", " "); - } - } - - if(assistantExe.isEmpty()) { - assistantExe = ::Locate(assistantName);//assistantExe = ::Locate(assistantProgName); - /* - QString assistant = QCoreApplication::applicationDirPath(); - assistant += QDir::separator(); - assistant += assistantName; - assistantExe = assistant; - */ + if (pqImplementation::helpWindow) { + pqImplementation::helpWindow->hide(); } + showView( false ); - this->Implementation->AssistantClient = new QAssistantClient(assistantExe, this); - QObject::connect(this->Implementation->AssistantClient, SIGNAL(error(const QString&)), - this, SLOT(assistantError(const QString&))); + // hide menus + menuMgr()->hide(mySourcesMenuId); + menuMgr()->hide(myFiltersMenuId); + menuMgr()->hide(myMacrosMenuId); + menuMgr()->hide(myToolbarsMenuId); + setMenuShown( false ); + setToolShown( false ); - QStringList args; - args.append(QString("-profile")); + saveDockWidgetsState(); - if(profileFile.isEmpty()) { - // see if help is bundled up with the application - QString profile = ::Locate("pqClient.adp"); - /*QCoreApplication::applicationDirPath() + QDir::separator() - + QString("pqClient.adp");*/ - - if(QFile::exists(profile)) - profileFile = profile; + // hide toolbars + QList aToolbars = myToolbarState.keys(); + foreach(QToolBar* aBar, aToolbars) { + myToolbarState[aBar] = aBar->isVisible(); + aBar->hide(); + aBar->setParent(0); } - if(profileFile.isEmpty() && getenv("PARAVIEW_HELP")) { - // not bundled, ask for help - args.append(getenv("PARAVIEW_HELP")); - } - else if(profileFile.isEmpty()) { - // no help, error out - SUIT_MessageBox::critical(getApp()->desktop(),"Help error", "Couldn't find" - " pqClient.adp.\nTry setting the PARAVIEW_HELP environment variable which" - " points to that file"); - delete this->Implementation->AssistantClient; - return; - } + if (myOldMsgHandler) + qInstallMsgHandler(myOldMsgHandler); + return SalomeApp_Module::deactivateModule( study ); +} + - QFileInfo fi(profileFile); - this->Implementation->DocumentationDir = fi.absolutePath(); +/*! + \brief Called when application is closed. - args.append(profileFile); + Process finalize application functionality from ParaView in order to save server settings + and nullify application pointer if the application is being closed. - this->Implementation->AssistantClient->setArguments(args); + \param theApp application +*/ +void PVGUI_Module::onApplicationClosed( SUIT_Application* theApp ) +{ + pqApplicationCore::instance()->settings()->sync(); + int aAppsNb = SUIT_Session::session()->applications().size(); + if (aAppsNb == 1) { + deleteTemporaryFiles(); + //pvShutdown(); + } + CAM_Module::onApplicationClosed(theApp); } /*! - \brief Slot to call the message handler with the critical message. + \brief Compares the contents of the window with the given reference image, + returns true if they "match" within some tolerance. */ -void PVGUI_Module::assistantError( const QString& error ) +/*VSV it seems that this method is obsolete +bool PVGUI_Module::compareView( const QString& ReferenceImage, double Threshold, + std::ostream& Output, const QString& TempDirectory ) { - qCritical(error.toAscii().data()); + if ( Implementation ) + return Implementation->Core.compareView( ReferenceImage, Threshold, Output, TempDirectory ); + return false; +} +*/ +QString PVGUI_Module::engineIOR() const +{ + CORBA::String_var anIOR = PARAVIS::GetParavisGen(this)->GetIOR(); + return QString(anIOR.in()); } + /*! - \brief Slot to show the waiting state. + \brief Open file of format supported by ParaView */ -void PVGUI_Module::onPreAccept() +void PVGUI_Module::openFile(const char* theName) { - getApp()->desktop()->statusBar()->showMessage(tr("STB_PREACCEPT")); - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + QStringList aFiles; + aFiles<desktop()->statusBar()->showMessage(tr("STB_POSTACCEPT"), 2000); - QTimer::singleShot(0, this, SLOT(endWaitCursor())); + pqPythonDialog* pyDiag = 0; + pqPythonManager* manager = qobject_cast( + pqApplicationCore::instance()->manager("PYTHON_MANAGER")); + if (manager) { + pyDiag = manager->pythonShellDialog(); + } + + QString traceString; + if (pyDiag) { + pyDiag->runString("try:\n" + " from paraview import smtrace\n" + " __smtraceString = smtrace.get_trace_string()\n" + "except:\n" + " __smtraceString = str()\n" + " raise RuntimeError('could not import paraview.smtrace')\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 = PyString_AsString(string_object); + if (string_ptr) { + traceString = string_ptr; + } + pyDiag->shell()->releaseControl(); + } + return traceString; } /*! - \brief Slot to switch off wait cursor. + \brief Saves trace string to disk file */ -void PVGUI_Module::endWaitCursor() +void PVGUI_Module::saveTrace(const char* theName) { - QApplication::restoreOverrideCursor(); + //save_trace(theName); + QFile file(theName); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + MESSAGE( "Could not open file:" << theName ); + return; + } + QTextStream out(&file); + out << getTraceString(); + file.close(); } /*! - \brief Returns the ParaView multi-view manager. + \brief Saves ParaView state to a disk file */ -pqViewManager* PVGUI_Module::getMultiViewManager() const +void PVGUI_Module::saveParaviewState(const char* theFileName) { - pqViewManager* aMVM = 0; - if ( Implementation ) - aMVM = &Implementation->Core.multiViewManager(); - return aMVM; + Implementation->Core->saveState(theFileName); } /*! - \brief Processes QEvent::ActionAdded and QEvent::ActionRemoved from Lookmarks toolbar - in order to register/unregister this action in/from QtxActionToolMgr. + \brief Restores ParaView state from a disk file */ -bool PVGUI_Module::eventFilter( QObject* theObject, QEvent* theEvent ) +void PVGUI_Module::loadParaviewState(const char* theFileName) { - QToolBar* aTB = toolMgr()->toolBar(tr("TOOL_LOOKMARKS")); - if ( theObject == aTB ) { - - if ( theEvent->type() == QEvent::ActionAdded ) { - QList anActns = aTB->actions(); - for (int i = 0; i < anActns.size(); ++i) - if ( toolMgr()->actionId(anActns.at(i)) == -1 ) { - toolMgr()->setUpdatesEnabled(false); - createTool( anActns.at(i), tr("TOOL_LOOKMARKS") ); - toolMgr()->setUpdatesEnabled(true); - } - } - - if ( theEvent->type() == QEvent::ActionRemoved ) { - QList anActns = aTB->actions(); - QIntList aIDL = toolMgr()->idList(); - for (int i = 0; i < aIDL.size(); ++i) { - if ( toolMgr()->action(aIDL.at(i))->parent() == aTB - && - !anActns.contains( toolMgr()->action(aIDL.at(i)) ) ) { - toolMgr()->setUpdatesEnabled(false); - toolMgr()->unRegisterAction( aIDL.at(i) ); - toolMgr()->remove( aIDL.at(i), tr("TOOL_LOOKMARKS") ); - toolMgr()->setUpdatesEnabled(true); - } - } - } - - } - - return QObject::eventFilter( theObject, theEvent ); + Implementation->Core->loadState(theFileName, getActiveServer()); } /*! - \brief Activate module. - \param study current study - \return \c true if activaion is done successfully or 0 to prevent - activation on error + \brief Imports MED data from VISU module by data entry */ -bool PVGUI_Module::activateModule( SUIT_Study* study ) +void PVGUI_Module::onImportFromVisu(QString theEntry) { - bool isDone = LightApp_Module::activateModule( study ); - if ( !isDone ) return false; +#ifdef WITH_VISU + SUIT_OverrideCursor aWaitCursor; - showView( true ); + // get active study + SalomeApp_Study* activeStudy = dynamic_cast(application()->activeStudy()); + if(!activeStudy) return; - if ( mySourcesMenuId != -1 ) menuMgr()->show(mySourcesMenuId); - if ( myFiltersMenuId != -1 ) menuMgr()->show(myFiltersMenuId); - setMenuShown( true ); - setToolShown( true ); + // get SALOMEDS client study + _PTR(Study) aStudy = activeStudy->studyDS(); + if(!aStudy) return; - toolMgr()->toolBar(tr("TOOL_LOOKMARKS"))->installEventFilter(this); + // find VISU component in a study + _PTR(SComponent) aVisuComp = aStudy->FindComponent( "VISU" ); + if(!aVisuComp) return; - // Make default server connection - if ( Implementation ) - Implementation->Core.makeDefaultConnectionIfNoneExists(); + // get SObject client by entry + _PTR(SObject) aSObj = aStudy->FindObjectID(qPrintable(theEntry)); + if (!aSObj) return; - restoreDockWidgetsState(); + // get CORBA SObject + SALOMEDS_SObject* aSObject = _CAST(SObject, aSObj); + if ( !aSObject ) return; - return isDone; -} + // load VISU engine + SALOME_NamingService* aNamingService = SalomeApp_Application::namingService(); + SALOME_LifeCycleCORBA aLCC(aNamingService); + + Engines::Component_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) ); + // set current study to VISU engine + //aVISU->SetCurrentStudy(aStudyVar); + + // 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 Deactivate module. - \param study current study - \return \c true if deactivaion is done successfully or 0 to prevent - deactivation on error + \brief Deletes temporary files created during import operation from VISU */ -bool PVGUI_Module::deactivateModule( SUIT_Study* study ) +void PVGUI_Module::deleteTemporaryFiles() { - toolMgr()->toolBar(tr("TOOL_LOOKMARKS"))->removeEventFilter(this); + foreach(QString aFile, myTemporaryFiles) { + if (QFile::exists(aFile)) { + QFile::remove(aFile); + } + } +} - showView( false ); - // hide menus - menuMgr()->hide(mySourcesMenuId); - menuMgr()->hide(myFiltersMenuId); - setMenuShown( false ); - setToolShown( false ); +/*! + \brief Returns current active ParaView server +*/ +pqServer* PVGUI_Module::getActiveServer() +{ + return Implementation->Core->getActiveServer(); +} - saveDockWidgetsState(); - return LightApp_Module::deactivateModule( study ); +/*! + \brief Creates PARAVIS preference pane +*/ +void PVGUI_Module::createPreferences() +{ + int TraceTab = addPreference( tr( "TIT_TRACE" ) ); + addPreference( tr( "PREF_STOP_TRACE" ), TraceTab, LightApp_Preferences::Bool, "PARAVIS", "stop_trace"); + + int aSaveType = addPreference(tr( "PREF_SAVE_TYPE_LBL" ), TraceTab, + LightApp_Preferences::Selector, + "PARAVIS", "savestate_type"); + QList aIndices; + QStringList aStrings; + aIndices<<0<<1<<2; + aStrings<