X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPVGUI%2FPVGUI_Module.cxx;h=02cc591668d560bb81929f488c044615f8ac326e;hb=46e35567d5421e5f833c3dcfaa56a4d7be35b0c0;hp=247f4b69637da5492a189856c5b6cd04cc9f7bfc;hpb=e006e7d4f09b179c9c7819297cd0b877be6b158f;p=modules%2Fparavis.git diff --git a/src/PVGUI/PVGUI_Module.cxx b/src/PVGUI/PVGUI_Module.cxx index 247f4b69..02cc5916 100644 --- a/src/PVGUI/PVGUI_Module.cxx +++ b/src/PVGUI/PVGUI_Module.cxx @@ -1,6 +1,6 @@ // PARAVIS : ParaView wrapper SALOME module // -// Copyright (C) 2010-2015 CEA/DEN, EDF R&D +// Copyright (C) 2010-2019 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 @@ -87,7 +87,6 @@ #include #include #include -#include #include #include #include @@ -109,7 +108,7 @@ #include #include #include -#include +//#include #include #include #include @@ -124,6 +123,21 @@ #include #include #include +#include +#include + +#if PY_VERSION_HEX < 0x03050000 +static char* +Py_EncodeLocale(const wchar_t *arg, size_t *size) +{ + return _Py_wchar2char(arg, size); +} +static wchar_t* +Py_DecodeLocale(const char *arg, size_t *size) +{ + return _Py_char2wchar(arg, size); +} +#endif //---------------------------------------------------------------------------- PVGUI_Module* ParavisModule = 0; @@ -168,6 +182,7 @@ PVGUI_Module::PVGUI_Module() myFiltersMenuId( -1 ), myMacrosMenuId(-1), myRecentMenuId(-1), + myCatalystMenuId(-1), myOldMsgHandler(0), myTraceWindow(0), myInitTimer(0), @@ -177,20 +192,6 @@ PVGUI_Module::PVGUI_Module() Q_INIT_RESOURCE( PVGUI ); #endif ParavisModule = this; - - // 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 aMacrosPath, getEmbeddedMacrosList()) { - QString aMacrosName = QFileInfo(aMacrosPath).fileName(); - if (aDestFiles.contains(aMacrosName)) { - aDestDir.remove(aMacrosName); - } - } } /*! @@ -255,9 +256,26 @@ void PVGUI_Module::initialize( CAM_Application* app ) // Initialize ParaView client and associated behaviors // and connect to externally launched pvserver - PVViewer_Core::ParaviewInitApp(aDesktop, anApp->logWindow()); + PVViewer_Core::ParaviewInitApp(aDesktop); + + // Clear old copies of embedded macros files + //QString aDestPath = QString( "%1/.config/%2/Macros" ).arg( QDir::homePath() ).arg( QApplication::applicationName() ); + QString aDestPath = pqCoreUtilities::getParaViewUserDirectory() + "/Macros"; + QStringList aFilter; + aFilter << "*.py"; + + QDir aDestDir(aDestPath); + QStringList aDestFiles = aDestDir.entryList(aFilter, QDir::Files); + foreach(QString aMacrosPath, getEmbeddedMacrosList()) { + QString aMacrosName = QFileInfo(aMacrosPath).fileName(); + if (aDestFiles.contains(aMacrosName)) { + aDestDir.remove(aMacrosName); + } + } + myGuiElements = PVViewer_GUIElements::GetInstance(aDesktop); + // [ABN]: careful with the order of the GUI element creation, the loading of the configuration // and the connection to the server. This order is very sensitive if one wants to make // sure all menus, etc ... are correctly populated. @@ -361,6 +379,7 @@ void PVGUI_Module::initialize( CAM_Application* app ) } } } + connect( application(), SIGNAL( appClosed() ), this, SLOT( onStopTrace() ) ); } /*! @@ -463,7 +482,7 @@ void PVGUI_Module::showView( bool toShow ) PVViewer_ViewManager* viewMgr = dynamic_cast( anApp->getViewManager( PVViewer_Viewer::Type(), false ) ); if ( !viewMgr ) { - viewMgr = new PVViewer_ViewManager( anApp->activeStudy(), anApp->desktop(), anApp->logWindow() ); + viewMgr = new PVViewer_ViewManager( anApp->activeStudy(), anApp->desktop() ); anApp->addViewManager( viewMgr ); connect( viewMgr, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ), anApp, SLOT( onCloseView( SUIT_ViewManager* ) ) ); @@ -475,7 +494,7 @@ void PVGUI_Module::showView( bool toShow ) // this also connects to the pvserver and instantiates relevant PV behaviors } - pvWnd->setShown( toShow ); + pvWnd->setVisible( toShow ); if ( toShow ) pvWnd->setFocus(); } @@ -513,28 +532,6 @@ void PVGUI_Module::endWaitCursor() QApplication::restoreOverrideCursor(); } -/*! - \brief Handler method for the output of messages. -*/ -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 Activate module. \param study current study @@ -543,8 +540,6 @@ static void ParavisMessageOutput(QtMsgType type, const char *msg) */ bool PVGUI_Module::activateModule( SUIT_Study* study ) { - myOldMsgHandler = qInstallMsgHandler(ParavisMessageOutput); - SUIT_ExceptionHandler::addCleanUpRoutine( paravisCleanUp ); storeCommonWindowsState(); @@ -556,6 +551,7 @@ bool PVGUI_Module::activateModule( SUIT_Study* study ) if ( mySourcesMenuId != -1 ) menuMgr()->show(mySourcesMenuId); if ( myFiltersMenuId != -1 ) menuMgr()->show(myFiltersMenuId); if ( myMacrosMenuId != -1 ) menuMgr()->show(myMacrosMenuId); + if ( myCatalystMenuId != -1 ) menuMgr()->show(myCatalystMenuId); // Update the various menus with the content pre-loaded in myGuiElements // QMenu* srcMenu = menuMgr()->findMenu( mySourcesMenuId ); @@ -588,7 +584,13 @@ bool PVGUI_Module::activateModule( SUIT_Study* study ) } if ( myRecentMenuId != -1 ) menuMgr()->show(myRecentMenuId); - + + // VSR 18/10/2018 - 0023170: Workaround to re-select current index after module activation + QItemSelectionModel* selection_model = myGuiElements->getPipelineBrowserWidget()->getSelectionModel(); + QModelIndex idx = selection_model->currentIndex(); + selection_model->clearCurrentIndex(); + selection_model->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect); + return isDone; } @@ -634,6 +636,7 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study ) menuMgr()->hide(mySourcesMenuId); menuMgr()->hide(myFiltersMenuId); menuMgr()->hide(myMacrosMenuId); + menuMgr()->hide(myCatalystMenuId); setMenuShown( false ); setToolShown( false ); @@ -642,7 +645,7 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study ) SUIT_ExceptionHandler::removeCleanUpRoutine( paravisCleanUp ); if (myOldMsgHandler) - qInstallMsgHandler(myOldMsgHandler); + qInstallMessageHandler(myOldMsgHandler); restoreCommonWindowsState(); @@ -731,6 +734,19 @@ void PVGUI_Module::stopTrace() */ void PVGUI_Module::executeScript( const char* script ) { + // ??? + // Not sure this is the right fix, but the PYTHON_MANAGER has a function named + // executeScript() which seems to do what the runScript on pyShellDialog() class + // was doing. +#ifndef WNT + pqPythonManager* manager = + qobject_cast(pqApplicationCore::instance()->manager("PYTHON_MANAGER")); + + if ( manager ) { + manager->executeScript(script); + } +#endif + /* #ifndef WNT pqPythonManager* manager = qobject_cast( pqApplicationCore::instance()->manager( "PYTHON_MANAGER" ) ); @@ -741,6 +757,7 @@ void PVGUI_Module::executeScript( const char* script ) } } #endif + */ } ///** @@ -758,7 +775,7 @@ void PVGUI_Module::executeScript( const char* script ) // PyObject * elem = PyList_GetItem(lst, i); // if (PyString_Check(elem)) // { -// std::cout << "At pos:" << i << ", " << PyString_AsString(elem) << std::endl; +// std::cout << "At pos:" << i << ", " << Py_EncodeLocale(PyUnicode_AS_UNICODE(elem), NULL) << std::endl; // } // else // std::cout << "At pos:" << i << ", not a string!" << std::endl; @@ -797,24 +814,25 @@ QString PVGUI_Module::getTraceString() } // Save camera position to, which is no longer output by the tracer ... - VTK_PY_GIL_ENSURE - PyObject * mods(PySys_GetObject(const_cast("modules"))); - PyObject * trace_mod(PyDict_GetItemString(mods, "paraview.smtrace")); // module was already (really) imported by vtkSMTrace - if (PyModule_Check(trace_mod)) { - vtkSmartPyObject save_cam(PyObject_GetAttrString(trace_mod, const_cast("SaveCameras"))); - vtkSmartPyObject camera_trace(PyObject_CallMethod(save_cam, const_cast("get_trace"), NULL)); - // Convert to a single string - vtkSmartPyObject ret(PyString_FromString(end_line.toStdString().c_str())); - vtkSmartPyObject final_string(PyObject_CallMethod(ret, const_cast("join"), - const_cast("O"), (PyObject*)camera_trace)); - if (PyString_CheckExact(final_string)) - { - QString camera_qs(PyString_AsString(final_string)); // deep copy - traceString = traceString + end_line + end_line + QString("#### saving camera placements for all active views") - + end_line + end_line + camera_qs + end_line; - } - } - VTK_PY_GIL_RELEASE + { + vtkPythonScopeGilEnsurer psge; + PyObject * mods(PySys_GetObject(const_cast("modules"))); + PyObject * trace_mod(PyDict_GetItemString(mods, "paraview.smtrace")); // module was already (really) imported by vtkSMTrace + if (trace_mod && trace_mod != Py_None && PyModule_Check(trace_mod)) { + vtkSmartPyObject save_cam(PyObject_GetAttrString(trace_mod, const_cast("SaveCameras"))); + vtkSmartPyObject camera_trace(PyObject_CallMethod(save_cam, const_cast("get_trace"), NULL)); + // Convert to a single string + vtkSmartPyObject ret(PyUnicode_FromUnicode(Py_DecodeLocale(end_line.toStdString().c_str(), NULL), end_line.size())); + vtkSmartPyObject final_string(PyObject_CallMethod(ret, const_cast("join"), + const_cast("O"), (PyObject*)camera_trace)); + if (PyUnicode_CheckExact(final_string)) + { + QString camera_qs(Py_EncodeLocale(PyUnicode_AS_UNICODE(final_string.GetPointer()), NULL)); // deep copy + traceString = traceString + end_line + end_line + QString("#### saving camera placements for all active views") + + end_line + end_line + camera_qs + end_line; + } + } + } return traceString; } @@ -837,9 +855,9 @@ void PVGUI_Module::saveTrace( const char* theName ) /*! \brief Saves ParaView state to a disk file */ -void PVGUI_Module::saveParaviewState( const char* theFileName ) +void PVGUI_Module::saveParaviewState( const QString& theFileName ) { - pqApplicationCore::instance()->saveState( theFileName ); + pqApplicationCore::instance()->saveState( theFileName.toStdString().c_str() ); } /*! @@ -856,9 +874,9 @@ void PVGUI_Module::clearParaviewState() /*! \brief Restores ParaView state from a disk file */ -void PVGUI_Module::loadParaviewState( const char* theFileName ) +void PVGUI_Module::loadParaviewState( const QString& theFileName ) { - pqApplicationCore::instance()->loadState( theFileName, getActiveServer() ); + pqApplicationCore::instance()->loadState( theFileName.toStdString().c_str(), getActiveServer() ); } /*! @@ -893,7 +911,6 @@ void PVGUI_Module::createPreferences() addPreference( tr( "PREF_NO_EXT_PVSERVER" ), aParaVisSettingsTab, LightApp_Preferences::Bool, PARAVIS_MODULE_NAME, "no_ext_pv_server" ); - /* VSR: not used int aSaveType = addPreference( tr( "PREF_SAVE_TYPE_LBL" ), aParaVisSettingsTab, LightApp_Preferences::Selector, PARAVIS_MODULE_NAME, "savestate_type" ); @@ -904,7 +921,6 @@ void PVGUI_Module::createPreferences() aStrings << tr("PREF_SAVE_TYPE_0") << tr("PREF_SAVE_TYPE_1") << tr("PREF_SAVE_TYPE_2"); setPreferenceProperty( aSaveType, "strings", aStrings ); setPreferenceProperty( aSaveType, "indexes", aIndices ); - */ // ... "Language" group <> int traceGroup = addPreference( tr( "PREF_GROUP_TRACE" ), aParaVisSettingsTab ); @@ -949,6 +965,13 @@ void PVGUI_Module::onRestartTrace() startTrace(); } +/*! + \brief. Close ParaView python trace. +*/ +void PVGUI_Module::onStopTrace() +{ + stopTrace(); +} /*! \brief Called when view manager is added */