From 4c2252001dae8c524456de32578fe9fca7426780 Mon Sep 17 00:00:00 2001 From: Alexey Kondratyev Date: Mon, 18 Oct 2021 11:12:43 +0300 Subject: [PATCH] bos #26446: SHAPER: customize study opening; bos #26447: SHAPER: customize script execution * Add tab "General" in Preferences window. * Add algorithm to update displaying elements depending of settings. * Update opening file algorithm to activating parts depending of settings. * Update activating part algorithm to display elements depending of settings. * Update activating part algorithm to display elements depending of sub elements. * Update the documentation. --- doc/gui/General/Introduction.rst | 35 +++++++- doc/gui/images/general_preferences.png | Bin 0 -> 18751 bytes src/ModuleBase/ModuleBase_Preferences.cpp | 60 ++++++++++++++ src/ModuleBase/ModuleBase_Preferences.h | 6 ++ src/PartSet/PartSet_MenuMgr.cpp | 6 ++ src/SHAPERGUI/resources/LightApp.xml.in | 6 ++ src/XGUI/SHAPER.xml | 6 ++ src/XGUI/XGUI_Tools.cpp | 45 +++++++++++ src/XGUI/XGUI_Tools.h | 5 ++ src/XGUI/XGUI_Workshop.cpp | 46 +++++++++++ src/XGUI/XGUI_WorkshopListener.cpp | 92 ++++++++++++++-------- src/XGUI/XGUI_WorkshopListener.h | 3 + 12 files changed, 275 insertions(+), 35 deletions(-) create mode 100644 doc/gui/images/general_preferences.png diff --git a/doc/gui/General/Introduction.rst b/doc/gui/General/Introduction.rst index 35e17284c..359a7f5ec 100644 --- a/doc/gui/General/Introduction.rst +++ b/doc/gui/General/Introduction.rst @@ -451,6 +451,7 @@ To call **Preferences** dialog box: SHAPER preferences contains the following tabs: +- :ref:`general_preferences`; - :ref:`visualization_preferences`; - :ref:`plugins_preferences`; - :ref:`shortcuts_preferences`; @@ -458,10 +459,42 @@ SHAPER preferences contains the following tabs: - :ref:`sketch_preferences`. - :ref:`viewer_preferences`. -Visualization tab is activated by default when **Preferences** dialog box is opened in the active SHAPER module. +General tab is activated by default when **Preferences** dialog box is opened in the active SHAPER module. Other tabs are activated by click on tab header. +.. _general_preferences: + +General tab +^^^^^^^^^^^ + +This tab defines what parts to be activated and what elements to be visible after opening a study or a script. + +.. figure:: /images/general_preferences.png + :align: center + + **Preferences**: General tab + +**Input fields**: +- **Activate** relates to activation of part when opening a HDF document. Its could be one of the following: + + - “Last part” – activate last part in the document (**default value**); + - “All parts” – activate all parts within the document; + - “No activation” – do not activate any part. + +- **Display** in "Opening a study". It specifies the shapes, which should be visualized when activating a part. It could be one of the following: + + - “As stored in HDF” – display only the shapes visible before the document is saved (**default value**); + - “Last item in each folder” – show only the last result in each folder of the part: Constructions, Results, Groups, Fields; + - “All items” – show all shapes from each folder; + - “No visualization” – do not display any shape. + +- **Display** in "Launching a python script". It specifies the shapes, which should be visualized when loading a script using "File -> Load Script..." menu. It could be one of the following: + + - “Last item in each folder” – show only the last result in each folder of the part: Constructions, Results, Groups, Fields; + - “All items” – show all shapes from each folder(**default value**); + - “No visualization” – do not display any shape. + .. _visualization_preferences: Visualization tab diff --git a/doc/gui/images/general_preferences.png b/doc/gui/images/general_preferences.png new file mode 100644 index 0000000000000000000000000000000000000000..e7eee1721dfa4896351afd9cdf0e1fea2129cd42 GIT binary patch literal 18751 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 literal 0 HcmV?d00001 diff --git a/src/ModuleBase/ModuleBase_Preferences.cpp b/src/ModuleBase/ModuleBase_Preferences.cpp index c651c7d46..229603f83 100644 --- a/src/ModuleBase/ModuleBase_Preferences.cpp +++ b/src/ModuleBase/ModuleBase_Preferences.cpp @@ -35,6 +35,7 @@ const QString ModuleBase_Preferences::VIEWER_SECTION = "Viewer"; const QString ModuleBase_Preferences::MENU_SECTION = "Menu"; +const QString ModuleBase_Preferences::GENERAL_SECTION = "General"; SUIT_ResourceMgr* ModuleBase_Preferences::myResourceMgr = 0; @@ -115,6 +116,7 @@ void ModuleBase_Preferences::loadCustomProps() void ModuleBase_Preferences::createEditContent(ModuleBase_IPrefMgr* thePref, int thePage) { thePref->prefMgr()->setItemIcon(thePage, QIcon(":pictures/module.png")); + createGeneralTab(thePref, thePage); createCustomPage(thePref, thePage); } @@ -150,6 +152,64 @@ void ModuleBase_Preferences::resetConfigPropPreferences(SUIT_PreferenceMgr* theP } } +void ModuleBase_Preferences::createGeneralTab(ModuleBase_IPrefMgr* thePref, int thePageId) +{ + int generalTab = thePref->addPreference(QObject::tr("General"), thePageId, + SUIT_PreferenceMgr::Auto, QString(), QString()); + thePref->setItemProperty("columns", 2, generalTab); + + QStringList actItemList; + actItemList << QObject::tr("Last part") + << QObject::tr("All parts") + << QObject::tr("No activation"); + + QList actIdList; + actIdList << 0 << 1 << 2; + + // Group related to opening a study + int group = thePref->addPreference(QObject::tr("Opening a study"), generalTab, + SUIT_PreferenceMgr::Auto, QString(), QString()); + + int actId = thePref->addPreference(QObject::tr("Activate"), group, SUIT_PreferenceMgr::Selector, + ModuleBase_Preferences::GENERAL_SECTION, + "part_activation_study"); + thePref->setItemProperty("strings", actItemList, actId); + thePref->setItemProperty("indexes", actIdList, actId); + + QStringList visuItemList; + visuItemList << QObject::tr("As stored in HDF") + << QObject::tr("Last item in each folder") + << QObject::tr("All items") + << QObject::tr("No visualization"); + + QList visuIdList; + visuIdList << 0 << 1 << 2 << 3; + + int visuId = thePref->addPreference(QObject::tr("Display"), group, SUIT_PreferenceMgr::Selector, + ModuleBase_Preferences::GENERAL_SECTION, + "part_visualization_study"); + thePref->setItemProperty("strings", visuItemList, visuId); + thePref->setItemProperty("indexes", visuIdList, visuId); + + // Group related to running a python script + group = thePref->addPreference(QObject::tr("Launching a python script"), generalTab, + SUIT_PreferenceMgr::Auto, QString(), QString()); + + visuItemList.clear(); + visuItemList << QObject::tr("Last item in each folder") + << QObject::tr("All items") + << QObject::tr("No visualization"); + + visuIdList.clear(); + visuIdList << 0 << 1 << 2; + + visuId = thePref->addPreference(QObject::tr("Display"), group, SUIT_PreferenceMgr::Selector, + ModuleBase_Preferences::GENERAL_SECTION, + "part_visualization_script"); + thePref->setItemProperty("strings", visuItemList, visuId); + thePref->setItemProperty("indexes", visuIdList, visuId); +} + void ModuleBase_Preferences::createCustomPage(ModuleBase_IPrefMgr* thePref, int thePageId) { SUIT_ResourceMgr* aResMgr = ModuleBase_Preferences::resourceMgr(); diff --git a/src/ModuleBase/ModuleBase_Preferences.h b/src/ModuleBase/ModuleBase_Preferences.h index 985262569..65b2a2d7a 100644 --- a/src/ModuleBase/ModuleBase_Preferences.h +++ b/src/ModuleBase/ModuleBase_Preferences.h @@ -47,6 +47,9 @@ class MODULEBASE_EXPORT ModuleBase_Preferences /// Name of preferences of menu section static const QString MENU_SECTION; + /// Name of preferences of general section + static const QString GENERAL_SECTION; + /// Shows a dialog box to edit preferences /// \param theModified a list of modified preferences static bool editPreferences(ModuleBase_Prefs& theModified); @@ -83,6 +86,9 @@ private: /// Set default values to the Config_PropManager properties static void resetConfig(); + /// Creates a content for General tab, which defines behavior of loading parts and displaying shapes + static void createGeneralTab(ModuleBase_IPrefMgr* thePref, int thePageId); + /// Creates content of preferences editing widget static void createCustomPage(ModuleBase_IPrefMgr* thePref, int thePageId); diff --git a/src/PartSet/PartSet_MenuMgr.cpp b/src/PartSet/PartSet_MenuMgr.cpp index ce5f478a3..d9e7aa8be 100644 --- a/src/PartSet/PartSet_MenuMgr.cpp +++ b/src/PartSet/PartSet_MenuMgr.cpp @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -495,15 +496,20 @@ void PartSet_MenuMgr::onActivatePart(bool) void PartSet_MenuMgr::activatePart(ResultPartPtr thePart) const { bool isFirstLoad = !thePart->partDoc().get(); + ModuleBase_Tools::blockUpdateViewer(true); thePart->activate(); if (isFirstLoad) { XGUI_Workshop* aWorkshop = myModule->getWorkshop(); XGUI_ObjectsBrowser* aObjBrowser = aWorkshop->objectBrowser(); + XGUI_Tools::setDisplaying(thePart); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); + aObjBrowser->onSelectionChanged(); DocumentPtr aDoc = thePart->partDoc(); std::list aStates; aDoc->restoreNodesState(aStates); aObjBrowser->setStateForDoc(aDoc, aStates); } + ModuleBase_Tools::blockUpdateViewer(false); } void PartSet_MenuMgr::onActivateAllParts() diff --git a/src/SHAPERGUI/resources/LightApp.xml.in b/src/SHAPERGUI/resources/LightApp.xml.in index 33908724f..0a0028ab8 100644 --- a/src/SHAPERGUI/resources/LightApp.xml.in +++ b/src/SHAPERGUI/resources/LightApp.xml.in @@ -22,6 +22,12 @@ +
+ + + + +
diff --git a/src/XGUI/SHAPER.xml b/src/XGUI/SHAPER.xml index 879498824..94ff4fcc6 100644 --- a/src/XGUI/SHAPER.xml +++ b/src/XGUI/SHAPER.xml @@ -4,6 +4,12 @@
+
+ + + + +
diff --git a/src/XGUI/XGUI_Tools.cpp b/src/XGUI/XGUI_Tools.cpp index 6ff19daae..3314814f1 100644 --- a/src/XGUI/XGUI_Tools.cpp +++ b/src/XGUI/XGUI_Tools.cpp @@ -24,6 +24,7 @@ #include "ModuleBase_IWorkshop.h" #include "ModuleBase_Tools.h" +#include "ModuleBase_Preferences.h" #include #include @@ -36,9 +37,13 @@ #include #include #include +#include #include +#include #include +#include + #include #include @@ -401,4 +406,44 @@ void removeTemporaryFiles(const std::string& theDirectory, } } +// Set displaying status to every element on group +static void setDisplayingByLoop(DocumentPtr theDoc, int theSize, + std::string theGroup, bool theDisplayFromScript) +{ + int aDisplayingId = -1; + if (theDisplayFromScript) { + aDisplayingId = ModuleBase_Preferences::resourceMgr()->integerValue("General", + "part_visualization_script", -1); + // Increase ID to prevert using "As stored in HDF" + ++aDisplayingId; + } + else { + aDisplayingId = ModuleBase_Preferences::resourceMgr()->integerValue("General", + "part_visualization_study", -1); + + // if chosen "As stored in HDF" then don't change displaying + if (aDisplayingId == 0) + return; + } + + for (int anIndex = theSize - 1; anIndex >= 0; --anIndex) { + ObjectPtr anObject = theDoc->object(theGroup, anIndex); + anObject->setDisplayed((aDisplayingId == 1 && anIndex == theSize - 1) || aDisplayingId == 2); + } +} + +void setDisplaying(ResultPartPtr thePart, bool theDisplayFromScript) +{ + DocumentPtr aDoc = thePart->partDoc(); + int aConstructionSize = aDoc->size(ModelAPI_ResultConstruction::group()); + int aGroupSize = aDoc->size(ModelAPI_ResultGroup::group()); + int aFieldSize = aDoc->size(ModelAPI_ResultField::group()); + int aResultSize = aDoc->size(ModelAPI_ResultBody::group()); + setDisplayingByLoop(aDoc, aConstructionSize, + ModelAPI_ResultConstruction::group(), theDisplayFromScript); + setDisplayingByLoop(aDoc, aGroupSize, ModelAPI_ResultGroup::group(), theDisplayFromScript); + setDisplayingByLoop(aDoc, aFieldSize, ModelAPI_ResultField::group(), theDisplayFromScript); + setDisplayingByLoop(aDoc, aResultSize, ModelAPI_ResultBody::group(), theDisplayFromScript); +} + } diff --git a/src/XGUI/XGUI_Tools.h b/src/XGUI/XGUI_Tools.h index 478857fb3..65d0f424d 100644 --- a/src/XGUI/XGUI_Tools.h +++ b/src/XGUI/XGUI_Tools.h @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -135,6 +136,10 @@ std::string getTmpDirByEnv( const char* thePathEnv); /// Removes files and directory where they are located void removeTemporaryFiles(const std::string& theDirectory, const std::list& theFiles); + +/// Set displaying status for elements from part depending on the settings +/// \param thePart a pointer of part +XGUI_EXPORT void setDisplaying(ResultPartPtr thePart, bool theDisplayFromScript = false); }; #endif diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 4342023ae..a572b5294 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -706,6 +706,21 @@ void XGUI_Workshop::deactivateActiveObject(const ObjectPtr& theObject, const boo myDisplayer->deactivateObjects(anObjects, theUpdateViewer); } } + + SUIT_Application * app = SUIT_Session::session()->activeApplication(); + + QVariant aVar = app->property("IsLoadedScript"); + + if (!aVar.isNull() && aVar.toBool()) { + DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); + int aSize = aRootDoc->size(ModelAPI_ResultPart::group()); + if (aSize > 0) { + ObjectPtr anPartObject = aRootDoc->object(ModelAPI_ResultPart::group(), aSize - 1); + ResultPartPtr aPart = std::dynamic_pointer_cast(anPartObject); + XGUI_Tools::setDisplaying(aPart, true); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); + } + } } //****************************************************** @@ -1067,6 +1082,37 @@ void XGUI_Workshop::openFile(const QString& theDirectory) } #endif + int anActivationId = + ModuleBase_Preferences::resourceMgr()->integerValue("General", "part_activation_study", -1); + int aSize = aRootDoc->size(ModelAPI_ResultPart::group()); + + if (anActivationId == 0 && aSize > 0) { + ObjectPtr anObject = aRootDoc->object(ModelAPI_ResultPart::group(), aSize - 1); + ResultPartPtr aPart = std::dynamic_pointer_cast(anObject); + if (aPart.get()) { + aPart->activate(); + XGUI_Tools::setDisplaying(aPart); + } + } + else if (anActivationId == 1) { + for (int anIndex = 0; anIndex < aSize; ++anIndex) { + ObjectPtr anObject = aRootDoc->object(ModelAPI_ResultPart::group(), anIndex); + ResultPartPtr aPart = std::dynamic_pointer_cast(anObject); + if (aPart.get()) { + aPart->activate(); + XGUI_Tools::setDisplaying(aPart); + + if (anIndex < aSize - 1) { + SessionPtr aMgr = ModelAPI_Session::get(); + aMgr->startOperation("Activation"); + aMgr->setActiveDocument(aMgr->moduleDocument()); + aMgr->finishOperation(); + updateCommandStatus(); + viewer()->update(); + } + } + } + } QApplication::restoreOverrideCursor(); } diff --git a/src/XGUI/XGUI_WorkshopListener.cpp b/src/XGUI/XGUI_WorkshopListener.cpp index b1092af83..8a3f3d181 100644 --- a/src/XGUI/XGUI_WorkshopListener.cpp +++ b/src/XGUI/XGUI_WorkshopListener.cpp @@ -50,6 +50,11 @@ #include #include +#ifdef HAVE_SALOME +#include +#include +#endif + #include "XGUI_ActionsMgr.h" #include "XGUI_Displayer.h" #include "XGUI_ErrorMgr.h" @@ -392,6 +397,10 @@ void XGUI_WorkshopListener:: void XGUI_WorkshopListener:: onFeatureCreatedMsg(const std::shared_ptr& theMsg) { + SUIT_Application * app = SUIT_Session::session()->activeApplication(); + + QVariant aVar = app->property("IsLoadedScript"); + std::set anObjects = theMsg->objects(); std::set::const_iterator aIt; #ifdef DEBUG_FEATURE_CREATED @@ -406,46 +415,32 @@ void XGUI_WorkshopListener:: //bool aHasPart = false; bool aDisplayed = false; - for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { - ObjectPtr anObject = *aIt; + if (aVar.isNull() || !aVar.toBool()) { + for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { + ObjectPtr anObject = *aIt; #ifdef DEBUG_RESULT_COMPSOLID - ResultPtr aRes = std::dynamic_pointer_cast(anObject); - if (aRes.get()) { - ResultCompSolidPtr aCompSolidRes = std::dynamic_pointer_cast(aRes); - if (aCompSolidRes.get()) { - qDebug(QString("COMPSOLID, numberOfSubs = %1") - .arg(aCompSolidRes->numberOfSubs()).toStdString().c_str()); + ResultPtr aRes = std::dynamic_pointer_cast(anObject); + if (aRes.get()) { + ResultCompSolidPtr aCompSolidRes = std::dynamic_pointer_cast(aRes); + if (aCompSolidRes.get()) { + qDebug(QString("COMPSOLID, numberOfSubs = %1") + .arg(aCompSolidRes->numberOfSubs()).toStdString().c_str()); + } + if (ModelAPI_Tools::compSolidOwner(aRes)) + qDebug("COMPSOLID sub-object"); } - if (ModelAPI_Tools::compSolidOwner(aRes)) - qDebug("COMPSOLID sub-object"); - } #endif - // the validity of the data should be checked here in order to avoid display of the objects, - // which were created, then deleted, but flush for the creation event happens after that - // we should not display disabled objects - bool aHide = !anObject->data()->isValid() || - anObject->isDisabled() || - !anObject->isDisplayed(); - if (!aHide) { // check that this is not hidden result - ResultPtr aRes = std::dynamic_pointer_cast(anObject); - aHide = aRes && aRes->isConcealed(); - // Hide the presentation with an empty shape. But isDisplayed state of the object should not - // be changed to the object becomes visible when the shape becomes not empty - if (!aHide && aRes.get()) - aHide = !aRes->shape().get() || aRes->shape()->isNull(); - } - if (!aHide) { - // setDisplayed has to be called in order to synchronize internal state of the object - // with list of displayed objects - if (myWorkshop->module()->canDisplayObject(anObject)) { - anObject->setDisplayed(true); - aDisplayed = displayObject(anObject); - } else - anObject->setDisplayed(false); + + ResultBodyPtr aRes = std::dynamic_pointer_cast(anObject); + + if (aRes.get() && aRes->numberOfSubs() > 0) + for (int anIndex = 0; anIndex < aRes->numberOfSubs(); ++anIndex) + setDisplayed(aRes->subResult(anIndex), aDisplayed); + else + setDisplayed(anObject, aDisplayed); } } - MAYBE_UNUSED bool isCustomized = customizeFeature(anObjects, aDisplayed); //if (myObjectBrowser) @@ -558,3 +553,32 @@ XGUI_Workshop* XGUI_WorkshopListener::workshop() const { return myWorkshop; } + + +void XGUI_WorkshopListener::setDisplayed(ObjectPtr theObject, bool& theDisplayed) +{ + // the validity of the data should be checked here in order to avoid display of the objects, + // which were created, then deleted, but flush for the creation event happens after that + // we should not display disabled objects + bool aHide = !theObject->data()->isValid() || + theObject->isDisabled() || + !theObject->isDisplayed(); + if (!aHide) { // check that this is not hidden result + ResultPtr aRes = std::dynamic_pointer_cast(theObject); + aHide = aRes && aRes->isConcealed(); + // Hide the presentation with an empty shape. But isDisplayed state of the object should not + // be changed to the object becomes visible when the shape becomes not empty + if (!aHide && aRes.get()) + aHide = !aRes->shape().get() || aRes->shape()->isNull(); + } + if (!aHide) { + // setDisplayed has to be called in order to synchronize internal state of the object + // with list of displayed objects + if (myWorkshop->module()->canDisplayObject(theObject)) { + theObject->setDisplayed(true); + theDisplayed = displayObject(theObject); + } + else + theObject->setDisplayed(false); + } +} diff --git a/src/XGUI/XGUI_WorkshopListener.h b/src/XGUI/XGUI_WorkshopListener.h index d8827d57b..dcedeb713 100644 --- a/src/XGUI/XGUI_WorkshopListener.h +++ b/src/XGUI/XGUI_WorkshopListener.h @@ -103,6 +103,9 @@ protected: XGUI_Workshop* workshop() const; private: + + void setDisplayed(ObjectPtr theObject, bool& theDisplayed); + XGUI_Workshop* myWorkshop; // the current workshop bool myUpdatePrefs; -- 2.39.2