From 3f64d388410efbb72edbd800e1dd404695ee1aba Mon Sep 17 00:00:00 2001 From: mpv Date: Fri, 8 Apr 2022 19:57:15 +0300 Subject: [PATCH] bos #29475 Option to create new part on study open --- doc/gui/General/Introduction.rst | 4 +- doc/gui/images/general_preferences.png | Bin 18751 -> 19332 bytes src/Events/CMakeLists.txt | 2 + src/Events/Events_MessageBool.cpp | 26 ++++++++ src/Events/Events_MessageBool.h | 62 ++++++++++++++++++ .../InitializationPlugin_Plugin.cpp | 36 ++++++++-- .../InitializationPlugin_Plugin.h | 4 ++ src/Model/Model_Document.cpp | 15 +++++ src/Model/Model_Document.h | 2 + src/Model/Model_Session.cpp | 8 +++ src/Model/Model_Session.h | 2 + src/ModelAPI/ModelAPI_Events.h | 4 ++ src/ModelAPI/ModelAPI_Session.h | 8 +++ src/ModelHighAPI/ModelHighAPI_Services.cpp | 29 +++++++- src/ModuleBase/ModuleBase_Preferences.cpp | 45 +++++++------ src/ModuleBase/ModuleBase_msg_fr.ts | 8 +++ src/PartSet/PartSet_Module.cpp | 8 +++ src/SHAPERGUI/SHAPERGUI.cpp | 10 +++ src/SHAPERGUI/resources/LightApp.xml.in | 1 + src/XGUI/SHAPER.xml | 1 + src/XGUI/XGUI_Workshop.cpp | 7 ++ src/XGUI/XGUI_WorkshopListener.cpp | 12 ++-- 22 files changed, 263 insertions(+), 31 deletions(-) create mode 100644 src/Events/Events_MessageBool.cpp create mode 100644 src/Events/Events_MessageBool.h diff --git a/doc/gui/General/Introduction.rst b/doc/gui/General/Introduction.rst index 4a9024657..b691bdf2a 100644 --- a/doc/gui/General/Introduction.rst +++ b/doc/gui/General/Introduction.rst @@ -475,7 +475,7 @@ Other tabs are activated by click on tab header. General tab ^^^^^^^^^^^ -This tab defines what parts to be activated and what elements to be visible after opening a study or a script. +This tab defines behavior of Parts and displayed objects on creation or opening of a study, or loading python scripts. .. figure:: /images/general_preferences.png :align: center @@ -484,6 +484,8 @@ This tab defines what parts to be activated and what elements to be visible afte **Input fields**: +- **Create new part** flag. If it is enabled, an empty part is created on a study creation. + - **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**); diff --git a/doc/gui/images/general_preferences.png b/doc/gui/images/general_preferences.png index e7eee1721dfa4896351afd9cdf0e1fea2129cd42..0589e79d940806f7c63efe910ee0c936e8fa8bab 100644 GIT binary patch literal 19332 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 literal 18751 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 diff --git a/src/Events/CMakeLists.txt b/src/Events/CMakeLists.txt index 242a1591b..6f47c6c73 100644 --- a/src/Events/CMakeLists.txt +++ b/src/Events/CMakeLists.txt @@ -30,6 +30,7 @@ SET(PROJECT_HEADERS Events_Loop.h Events_LongOp.h Events_InfoMessage.h + Events_MessageBool.h ) SET(PROJECT_SOURCES @@ -39,6 +40,7 @@ SET(PROJECT_SOURCES Events_Loop.cpp Events_LongOp.cpp Events_InfoMessage.cpp + Events_MessageBool.cpp ) SET(PROJECT_LIBRARIES diff --git a/src/Events/Events_MessageBool.cpp b/src/Events/Events_MessageBool.cpp new file mode 100644 index 000000000..eb79aaa29 --- /dev/null +++ b/src/Events/Events_MessageBool.cpp @@ -0,0 +1,26 @@ +// Copyright (C) 2014-2021 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, 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 +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "Events_MessageBool.h" + +void Events_MessageBool::send() +{ + std::shared_ptr aMsg(new Events_MessageBool(*this)); + Events_Loop::loop()->send(aMsg); +} diff --git a/src/Events/Events_MessageBool.h b/src/Events/Events_MessageBool.h new file mode 100644 index 000000000..891b0815d --- /dev/null +++ b/src/Events/Events_MessageBool.h @@ -0,0 +1,62 @@ +// Copyright (C) 2014-2021 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, 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 +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef Events_MessageBool_H_ +#define Events_MessageBool_H_ + +#include +#include +#include + +#include +#include + +/**\class Events_MessageBool + * \ingroup EventsLoop + * \brief An event message for sending a message with a boolean value. + * May be used for different where just a Boolean flag is needed to send. + */ +class Events_MessageBool: public Events_Message +{ +public: + + /// Constructor + /// \param theEventID an indentifier of the message + /// \param theValue a Boolean value to send + /// \param theSender a pointer on sender object + Events_MessageBool(const Events_ID theEventID, const bool theValue, const void* theSender = 0): + Events_Message(theEventID, theSender), myValue(theValue) {} + + /// Default destructor + virtual ~Events_MessageBool() {} + + /// Returns the value stored in this message. + const bool value() const { return myValue; } + + /// Sends the message + EVENTS_EXPORT void send(); + +private: + + /// The stored value + bool myValue; + +}; + +#endif diff --git a/src/InitializationPlugin/InitializationPlugin_Plugin.cpp b/src/InitializationPlugin/InitializationPlugin_Plugin.cpp index 228c30e9a..e934ae5c6 100644 --- a/src/InitializationPlugin/InitializationPlugin_Plugin.cpp +++ b/src/InitializationPlugin/InitializationPlugin_Plugin.cpp @@ -33,6 +33,7 @@ #include #include +#include #include @@ -40,14 +41,17 @@ static InitializationPlugin_Plugin* MY_INITIALIZATIONPLUGIN_INSTANCE = new InitializationPlugin_Plugin(); -InitializationPlugin_Plugin::InitializationPlugin_Plugin() +InitializationPlugin_Plugin::InitializationPlugin_Plugin() : + myCreatePartOnStart(false) // by default in TUI mode part is not created on start of PartSet { char* isUnitTest = getenv("SHAPER_UNIT_TEST_IN_PROGRESS"); myInitDataModel = (!isUnitTest || isUnitTest[0] != '1'); Events_Loop* aLoop = Events_Loop::loop(); - const Events_ID kDocCreatedEvent = ModelAPI_DocumentCreatedMessage::eventId(); + static const Events_ID kDocCreatedEvent = ModelAPI_DocumentCreatedMessage::eventId(); aLoop->registerListener(this, kDocCreatedEvent, NULL, true); + static const Events_ID kCreatePartEvent = Events_Loop::eventByName(EVENT_CREATE_PART_ON_START); + aLoop->registerListener(this, kCreatePartEvent, NULL, true); myEvalListener = std::shared_ptr(new InitializationPlugin_EvalListener()); @@ -55,7 +59,8 @@ InitializationPlugin_Plugin::InitializationPlugin_Plugin() void InitializationPlugin_Plugin::processEvent(const std::shared_ptr& theMessage) { - const Events_ID kDocCreatedEvent = ModelAPI_DocumentCreatedMessage::eventId(); + static const Events_ID kDocCreatedEvent = ModelAPI_DocumentCreatedMessage::eventId(); + static const Events_ID kCreatePartEvent = Events_Loop::eventByName(EVENT_CREATE_PART_ON_START); if (theMessage->eventID() == kDocCreatedEvent) { std::shared_ptr aMessage = std::dynamic_pointer_cast< ModelAPI_DocumentCreatedMessage>(theMessage); @@ -63,13 +68,15 @@ void InitializationPlugin_Plugin::processEvent(const std::shared_ptrmoduleDocument()) + SessionPtr aMgr = ModelAPI_Session::get(); + if (aDoc != aMgr->moduleDocument() || aMgr->isLoading()) return; if (myInitDataModel) myEvalListener->initDataModel(); std::list aFeatures; + aMgr->startOperation("Initialization"); // the viewer update should be blocked in order to avoid the features blinking before they are // hidden @@ -85,6 +92,8 @@ void InitializationPlugin_Plugin::processEvent(const std::shared_ptrflush(Events_Loop::eventByName(EVENT_OBJECT_CREATED)); @@ -100,13 +109,21 @@ void InitializationPlugin_Plugin::processEvent(const std::shared_ptrflush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); - // the viewer update should be unblocked in order to avoid the features blinking before they are - // hidden + + aMgr->finishOperation(); // before last message flush to update the title, make it not-modified + aMgr->clearUndoRedo(); // to forbid undo of auxiliary elements and initial part + + // the viewer update should be unblocked to avoid the features blinking before they are hidden aMsg = std::shared_ptr( new Events_Message(Events_Loop::eventByName(EVENT_UPDATE_VIEWER_UNBLOCKED))); Events_Loop::loop()->send(aMsg); } + else if (theMessage->eventID() == kCreatePartEvent) + { + std::shared_ptr aMsg = std::dynamic_pointer_cast(theMessage); + myCreatePartOnStart = aMsg->value(); + } } FeaturePtr InitializationPlugin_Plugin::createPlane(DocumentPtr theDoc, double theX, double theY, @@ -189,3 +206,10 @@ FeaturePtr InitializationPlugin_Plugin::createAxis(DocumentPtr theDoc, FeaturePt return aAxis; } + +void InitializationPlugin_Plugin::createPart(DocumentPtr thePartSet) +{ + std::shared_ptr aPart = thePartSet->addFeature("Part"); + if (aPart.get()) + aPart->execute(); // to initialize and activate this part document +} diff --git a/src/InitializationPlugin/InitializationPlugin_Plugin.h b/src/InitializationPlugin/InitializationPlugin_Plugin.h index bed22f693..4c0f583ed 100644 --- a/src/InitializationPlugin/InitializationPlugin_Plugin.h +++ b/src/InitializationPlugin/InitializationPlugin_Plugin.h @@ -70,9 +70,13 @@ class InitializationPlugin_Plugin : public Events_Listener FeaturePtr createAxis(DocumentPtr theDoc, FeaturePtr theOrigin, double theX, double theY, double theZ); + /// Creates and activates a new part in PartSet document. + void createPart(DocumentPtr thePartSet); + private: std::shared_ptr myEvalListener; bool myInitDataModel; + bool myCreatePartOnStart; }; #endif diff --git a/src/Model/Model_Document.cpp b/src/Model/Model_Document.cpp index 72b11c77e..25033c424 100644 --- a/src/Model/Model_Document.cpp +++ b/src/Model/Model_Document.cpp @@ -1129,6 +1129,21 @@ void Model_Document::redo() // update the current features status setCurrentFeature(currentFeature(false), false); } + +void Model_Document::clearUndoRedo() +{ + myNestedNum.clear(); + myTransactions.clear(); + myRedos.clear(); + myTransactionSave = 0; + myDoc->ClearUndos(); + myDoc->ClearRedos(); + // clear for all subs + const std::set aSubs = subDocuments(); + for (std::set::iterator aSubIter = aSubs.begin(); aSubIter != aSubs.end(); aSubIter++) + subDoc(*aSubIter)->clearUndoRedo(); +} + // this is used for creation of undo/redo1-list by GUI // LCOV_EXCL_START std::list Model_Document::undoList() const diff --git a/src/Model/Model_Document.h b/src/Model/Model_Document.h index 264fdf307..c93c694ba 100644 --- a/src/Model/Model_Document.h +++ b/src/Model/Model_Document.h @@ -106,6 +106,8 @@ class Model_Document : public ModelAPI_Document MODEL_EXPORT virtual bool canRedo(); //! Redoes last operation MODEL_EXPORT virtual void redo(); + //! Clears undo/redo lists + MODEL_EXPORT virtual void clearUndoRedo(); //! Adds to the document the new feature of the given feature id //! \param theID creates feature and puts it in the document diff --git a/src/Model/Model_Session.cpp b/src/Model/Model_Session.cpp index 607196456..37224746d 100644 --- a/src/Model/Model_Session.cpp +++ b/src/Model/Model_Session.cpp @@ -59,7 +59,9 @@ static Model_Session* myImpl = new Model_Session(); bool Model_Session::load(const char* theFileName) { + myIsLoading = true; bool aRes = ROOT_DOC->load(theFileName, "root", ROOT_DOC); + myIsLoading = false; return aRes; } @@ -178,6 +180,11 @@ std::list Model_Session::redoList() return ROOT_DOC->redoList(); } +void Model_Session::clearUndoRedo() +{ + return ROOT_DOC->clearUndoRedo(); +} + bool Model_Session::checkLicense(const std::string& thePluginName) { return getPlugin(thePluginName); @@ -447,6 +454,7 @@ Model_Session::Model_Session() { myPluginsInfoLoaded = false; myCheckTransactions = true; + myIsLoading = false; ModelAPI_Session::setSession(std::shared_ptr(this)); // register the configuration reading listener Events_Loop* aLoop = Events_Loop::loop(); diff --git a/src/Model/Model_Session.h b/src/Model/Model_Session.h index f01909bf7..5b300cb25 100644 --- a/src/Model/Model_Session.h +++ b/src/Model/Model_Session.h @@ -99,6 +99,8 @@ class Model_Session : public ModelAPI_Session, public Events_Listener MODEL_EXPORT virtual std::list undoList(); //! Returns stack of rolled back operations MODEL_EXPORT virtual std::list redoList(); + //! Clears undo and redo lists of all documents in the session + MODEL_EXPORT virtual void clearUndoRedo(); /// Returns the root document of the application (that may contains sub-documents) MODEL_EXPORT virtual std::shared_ptr moduleDocument(); diff --git a/src/ModelAPI/ModelAPI_Events.h b/src/ModelAPI/ModelAPI_Events.h index 0802986fd..20d90f09c 100644 --- a/src/ModelAPI/ModelAPI_Events.h +++ b/src/ModelAPI/ModelAPI_Events.h @@ -129,6 +129,10 @@ MAYBE_UNUSED static const char * EVENT_REMOVE_CONSTRAINTS = "RemoveConstrains"; /// Event ID that license of specified features is checked and valid MAYBE_UNUSED static const char * EVENT_FEATURE_LICENSE_VALID = "FeaturesLicenseValid"; +/// To send preferences information: create part on init or not +MAYBE_UNUSED static const char * EVENT_CREATE_PART_ON_START = "CreatePartOnStart"; + + /// Message that feature was changed (used for Object Browser update): moved, updated and deleted class MODELAPI_EXPORT ModelAPI_ObjectUpdatedMessage : public Events_MessageGroup { diff --git a/src/ModelAPI/ModelAPI_Session.h b/src/ModelAPI/ModelAPI_Session.h index 42739259c..4cfd45aa6 100644 --- a/src/ModelAPI/ModelAPI_Session.h +++ b/src/ModelAPI/ModelAPI_Session.h @@ -40,6 +40,9 @@ class ModelAPI_FiltersFactory; class MODELAPI_EXPORT ModelAPI_Session { +protected: + bool myIsLoading; ///< keeps the state of the loading of the document + public: /// Returns the real implementation (the alone instance per application) of the plugin manager static std::shared_ptr get(); @@ -49,6 +52,9 @@ class MODELAPI_EXPORT ModelAPI_Session //! \returns true if file was loaded successfully virtual bool load(const char* theFileName) = 0; + //! Returns true if a loading process is performed (so, no need to react on a new part creation) + virtual bool isLoading() { return myIsLoading; }; + //! Saves the OCAF document to the file. //! \param theFileName full name of the file to store //! \param theResults the result full file names that were stored by "save" @@ -86,6 +92,8 @@ class MODELAPI_EXPORT ModelAPI_Session virtual std::list undoList() = 0; //! Returns stack of rolled back operations (from last rolled back to first) virtual std::list redoList() = 0; + //! Clears undo and redo lists of all documents in the session + virtual void clearUndoRedo() = 0; /// Registers the plugin that creates features. /// It is obligatory for each plugin to call this function on loading to be found by diff --git a/src/ModelHighAPI/ModelHighAPI_Services.cpp b/src/ModelHighAPI/ModelHighAPI_Services.cpp index 3d993de00..fd564548b 100644 --- a/src/ModelHighAPI/ModelHighAPI_Services.cpp +++ b/src/ModelHighAPI/ModelHighAPI_Services.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -108,7 +109,33 @@ void begin() } std::ostringstream aTransactionName; aTransactionName << "Operation_" << aTransactionID; - ModelAPI_Session::get()->startOperation(aTransactionName.str()); + + // check the first transaction and part, automatically created on start of PartSet + std::shared_ptr aSession = ModelAPI_Session::get(); + if (aSession->undoList().empty() && aSession->redoList().empty() && // no undo/redo available + aSession->moduleDocument()->size(ModelAPI_ResultPart::group()) == 1 && // only one part + aSession->moduleDocument()->size(ModelAPI_Feature::group()) == 1) // only part feature + { + ResultPartPtr aPartRes = std::dynamic_pointer_cast + (aSession->moduleDocument()->object(ModelAPI_ResultPart::group(), 0)); + if (aPartRes.get() && aPartRes->isActivated()) + { + DocumentPtr aPartDoc = aPartRes->partDoc(); + if (aPartDoc.get() && aPartDoc->size(ModelAPI_Feature::group()) == 0) // no features in part + { + // remove the automtically created part + aSession->startOperation("Delete automatic part"); + FeaturePtr aPartFeature = std::dynamic_pointer_cast( + aSession->moduleDocument()->object(ModelAPI_Feature::group(), 0)); + aSession->setActiveDocument(aSession->moduleDocument()); + aSession->moduleDocument()->removeFeature(aPartFeature); + aSession->finishOperation(); + aSession->clearUndoRedo(); + } + } + } + + aSession->startOperation(aTransactionName.str()); } void end() diff --git a/src/ModuleBase/ModuleBase_Preferences.cpp b/src/ModuleBase/ModuleBase_Preferences.cpp index 669014dda..2447aa8b4 100644 --- a/src/ModuleBase/ModuleBase_Preferences.cpp +++ b/src/ModuleBase/ModuleBase_Preferences.cpp @@ -160,57 +160,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()); + 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"); + << 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, + // Group related to creation of a study + int group = thePref->addPreference(QObject::tr("Creation 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); + int actId = thePref->addPreference(QObject::tr("Create new part"), group, SUIT_PreferenceMgr::Bool, + ModuleBase_Preferences::GENERAL_SECTION, "create_init_part"); + + // Group related to running a python script + group = thePref->addPreference(QObject::tr("Launching a python script"), generalTab, + SUIT_PreferenceMgr::Auto, QString(), QString()); QStringList visuItemList; - visuItemList << QObject::tr("As stored in HDF") - << QObject::tr("Last item in each folder") + visuItemList << QObject::tr("Last item in each folder") << QObject::tr("All items") << QObject::tr("No visualization"); QList visuIdList; - visuIdList << 0 << 1 << 2 << 3; + visuIdList << 0 << 1 << 2; int visuId = thePref->addPreference(QObject::tr("Display"), group, SUIT_PreferenceMgr::Selector, ModuleBase_Preferences::GENERAL_SECTION, - "part_visualization_study"); + "part_visualization_script"); 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, + // Group related to opening a study + group = thePref->addPreference(QObject::tr("Opening a study"), generalTab, SUIT_PreferenceMgr::Auto, QString(), QString()); + 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); + visuItemList.clear(); - visuItemList << QObject::tr("Last item in each folder") + visuItemList << QObject::tr("As stored in HDF") + << QObject::tr("Last item in each folder") << QObject::tr("All items") << QObject::tr("No visualization"); visuIdList.clear(); - visuIdList << 0 << 1 << 2; + visuIdList << 0 << 1 << 2 << 3; visuId = thePref->addPreference(QObject::tr("Display"), group, SUIT_PreferenceMgr::Selector, ModuleBase_Preferences::GENERAL_SECTION, - "part_visualization_script"); + "part_visualization_study"); thePref->setItemProperty("strings", visuItemList, visuId); thePref->setItemProperty("indexes", visuIdList, visuId); } diff --git a/src/ModuleBase/ModuleBase_msg_fr.ts b/src/ModuleBase/ModuleBase_msg_fr.ts index 39de141b1..55870dd64 100644 --- a/src/ModuleBase/ModuleBase_msg_fr.ts +++ b/src/ModuleBase/ModuleBase_msg_fr.ts @@ -290,6 +290,14 @@ General Général + + Creation a study + Création d'une étude + + + Create new part + Création d'une nouvelle pièce + Opening a study Ouverture d'une étude diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 669abec83..8528d7687 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -123,6 +123,7 @@ #include #include +#include #include #include @@ -286,6 +287,13 @@ PartSet_Module::~PartSet_Module() void PartSet_Module::createFeatures() { ModuleBase_IModule::createFeatures(); + + // send signal to initialization plugin about the state of the preferences: to create part or not + bool aCreate = ModuleBase_Preferences::resourceMgr()->booleanValue( + ModuleBase_Preferences::GENERAL_SECTION, "create_init_part", true); + Events_MessageBool aCreateMsg(Events_Loop::eventByName(EVENT_CREATE_PART_ON_START), aCreate); + aCreateMsg.send(); + myRoot = new PartSet_RootNode(); myRoot->setWorkshop(workshop()); ModuleBase_IModule::loadProprietaryPlugins(); diff --git a/src/SHAPERGUI/SHAPERGUI.cpp b/src/SHAPERGUI/SHAPERGUI.cpp index daa467a94..c5702bf20 100644 --- a/src/SHAPERGUI/SHAPERGUI.cpp +++ b/src/SHAPERGUI/SHAPERGUI.cpp @@ -76,6 +76,7 @@ #include #include +#include #if OCC_VERSION_HEX < 0x070400 #define SALOME_PATCH_FOR_CTRL_WHEEL @@ -946,6 +947,8 @@ void SHAPERGUI::preferencesChanged(const QString& theSection, const QString& the QString aVal = aResMgr->stringValue(theSection, theParam); Config_Prop* aProp = Config_PropManager::findProp(theSection.toStdString(), theParam.toStdString()); + if (!aProp) + return; // invalid case, the property default value must be registered in XML file std::string aValue = aVal.toStdString(); if (aValue.empty()) { aValue = aProp->defaultValue(); @@ -991,6 +994,13 @@ void SHAPERGUI::preferencesChanged(const QString& theSection, const QString& the } } } + else if (theSection == ModuleBase_Preferences::GENERAL_SECTION && theParam == "create_init_part") { + bool aCreate = ModuleBase_Preferences::resourceMgr()->booleanValue( + ModuleBase_Preferences::GENERAL_SECTION, "create_init_part", true); + Events_MessageBool aCreateMsg(Events_Loop::eventByName(EVENT_CREATE_PART_ON_START), aCreate); + aCreateMsg.send(); + } + myWorkshop->displayer()->redisplayObjects(); } diff --git a/src/SHAPERGUI/resources/LightApp.xml.in b/src/SHAPERGUI/resources/LightApp.xml.in index 9aa2e5006..a28831769 100644 --- a/src/SHAPERGUI/resources/LightApp.xml.in +++ b/src/SHAPERGUI/resources/LightApp.xml.in @@ -27,6 +27,7 @@ +
diff --git a/src/XGUI/SHAPER.xml b/src/XGUI/SHAPER.xml index ed65fcec5..d2ae66807 100644 --- a/src/XGUI/SHAPER.xml +++ b/src/XGUI/SHAPER.xml @@ -9,6 +9,7 @@ +
diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 67a525988..624f64422 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -90,6 +90,7 @@ #include #include #include +#include #include #include @@ -1161,6 +1162,12 @@ void XGUI_Workshop::onPreferences() } else if (aSection == ModuleBase_Preferences::MENU_SECTION) { myMainWindow->menuObject()->updateFromResources(); } + else if (aSection == ModuleBase_Preferences::GENERAL_SECTION && aPref.second == "create_init_part") { + bool aCreate = ModuleBase_Preferences::resourceMgr()->booleanValue( + ModuleBase_Preferences::GENERAL_SECTION, "create_init_part", true); + Events_MessageBool aCreateMsg(Events_Loop::eventByName(EVENT_CREATE_PART_ON_START), aCreate); + aCreateMsg.send(); + } } std::vector aColor; try { diff --git a/src/XGUI/XGUI_WorkshopListener.cpp b/src/XGUI/XGUI_WorkshopListener.cpp index 3041162b1..7514897c2 100644 --- a/src/XGUI/XGUI_WorkshopListener.cpp +++ b/src/XGUI/XGUI_WorkshopListener.cpp @@ -193,10 +193,14 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& if (aWidgetSelector) workshop()->selector()->setSelected(aWidgetSelector->getAttributeSelection()); } - } else if (theMessage->eventID() == Events_Loop::eventByName("FinishOperation")/* || - theMessage->eventID() == Events_Loop::eventByName("AbortOperation")*/) - workshop()->facesPanel()->reset(false); // do not flush redisplay, it is flushed after event - + } + else if (theMessage->eventID() == Events_Loop::eventByName("FinishOperation")/* || + theMessage->eventID() == Events_Loop::eventByName("AbortOperation")*/) + { + XGUI_FacesPanel* aFacesPanel = workshop()->facesPanel(); + if (aFacesPanel) + aFacesPanel->reset(false); // do not flush redisplay, it is flushed after event + } //Update property panel on corresponding message. If there is no current operation (no //property panel), or received message has different feature to the current - do nothing. else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED)) { -- 2.39.2