From 182de51a49e6bf55fd81d092bbe77034f02f71c3 Mon Sep 17 00:00:00 2001 From: jfa Date: Thu, 27 Oct 2022 14:02:45 +0300 Subject: [PATCH] Fix SIGSEGV on model.checkPythonDump() in GUI --- src/Model/Model_Session.cpp | 8 ++++---- src/ModelAPI/ModelAPI_Events.h | 2 ++ src/PartSet/PartSet_Module.cpp | 5 ++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Model/Model_Session.cpp b/src/Model/Model_Session.cpp index 37224746d..2ca754f79 100644 --- a/src/Model/Model_Session.cpp +++ b/src/Model/Model_Session.cpp @@ -73,11 +73,11 @@ bool Model_Session::save(const char* theFileName, std::list& theRes void Model_Session::closeAll() { Model_Application::getApplication()->deleteAllDocuments(); - static const Events_ID aDocChangeEvent = Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED); + static const Events_ID aDocsCloseEvent = Events_Loop::eventByName(EVENT_DOCUMENTS_CLOSED); myCurrentDoc = NULL; - static std::shared_ptr aMsg(new Events_Message(aDocChangeEvent)); + static std::shared_ptr aMsg(new Events_Message(aDocsCloseEvent)); Events_Loop::loop()->send(aMsg); - Events_Loop::loop()->flush(aDocChangeEvent); + Events_Loop::loop()->flush(aDocsCloseEvent); } void Model_Session::startOperation(const std::string& theId, const bool theAttachedToNested) @@ -687,4 +687,4 @@ Handle(TDocStd_Application) Model_Session::application() { return Model_Application::getApplication(); } -#endif \ No newline at end of file +#endif diff --git a/src/ModelAPI/ModelAPI_Events.h b/src/ModelAPI/ModelAPI_Events.h index 20d90f09c..98ea6d896 100644 --- a/src/ModelAPI/ModelAPI_Events.h +++ b/src/ModelAPI/ModelAPI_Events.h @@ -60,6 +60,8 @@ MAYBE_UNUSED static const char * EVENT_OBJECT_TO_REDISPLAY = "ObjectsToRedisplay MAYBE_UNUSED static const char * EVENT_PLUGIN_LOADED = "PluginLoaded"; /// The active document becomes another one MAYBE_UNUSED static const char * EVENT_DOCUMENT_CHANGED = "CurrentDocumentChanged"; +/// All documents closed +MAYBE_UNUSED static const char * EVENT_DOCUMENTS_CLOSED = "AllDocumentsClosed"; /// Event ID that order of objects in group is changed, /// so, tree must be fully recreated (movement of feature) diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 8528d7687..eb8cf5589 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -188,6 +188,7 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) Events_Loop* aLoop = Events_Loop::loop(); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_DOCUMENTS_CLOSED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_LICENSE_VALID)); @@ -1674,7 +1675,9 @@ if (aObjIndex.isValid()) { \ //****************************************************** void PartSet_Module::processEvent(const std::shared_ptr& theMessage) { - if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOCUMENT_CHANGED)) { + if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOCUMENTS_CLOSED)) { + closeDocument(); + } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOCUMENT_CHANGED)) { SessionPtr aMgr = ModelAPI_Session::get(); if (!aMgr->hasModuleDocument()) // if document is closed, do not call the document creation return; -- 2.39.2