From c1d799e8315bd9dcafd52d4b9c4413a0b2142b17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Mon, 21 Oct 2013 21:49:54 +0200 Subject: [PATCH] prevent dangling pointers by clearing the active assembly after it was deleted --- src/Mod/Assembly/Gui/AppAssemblyGuiPy.cpp | 61 ++++++++++++------- src/Mod/Assembly/Gui/ViewProviderAssembly.cpp | 4 ++ 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/src/Mod/Assembly/Gui/AppAssemblyGuiPy.cpp b/src/Mod/Assembly/Gui/AppAssemblyGuiPy.cpp index 9f75430d3..84fbd5d71 100644 --- a/src/Mod/Assembly/Gui/AppAssemblyGuiPy.cpp +++ b/src/Mod/Assembly/Gui/AppAssemblyGuiPy.cpp @@ -37,53 +37,63 @@ #include // pointer to the active assembly object -Assembly::Item *ActiveAsmObject =0; -Gui::Document *ActiveGuiDoc =0; -App::Document *ActiveAppDoc =0; -Gui::ViewProviderDocumentObject *ActiveVp =0; +Assembly::Item* ActiveAsmObject =0; +Gui::Document* ActiveGuiDoc =0; +App::Document* ActiveAppDoc =0; +Gui::ViewProviderDocumentObject* ActiveVp =0; /* module functions */ -static PyObject * setActiveAssembly(PyObject *self, PyObject *args) -{ - if(ActiveAsmObject){ +static PyObject* setActiveAssembly(PyObject* self, PyObject* args) +{ + if(ActiveAsmObject) { // check if the document not already closed std::vector docs = App::GetApplication().getDocuments(); - for(std::vector::const_iterator it=docs.begin();it!=docs.end();++it) - if(*it == ActiveAppDoc){ + for(std::vector::const_iterator it=docs.begin(); it!=docs.end(); ++it) + if(*it == ActiveAppDoc) { ActiveGuiDoc->signalHighlightObject(*ActiveVp,Gui::Blue,false); break; } - + ActiveAsmObject = 0; ActiveGuiDoc =0; ActiveAppDoc =0; ActiveVp =0; } - PyObject *object=0; - if (PyArg_ParseTuple(args,"|O!",&(Assembly::ItemPy::Type), &object)&& object) { + PyObject* object=0; + if(PyArg_ParseTuple(args,"|O!",&(Assembly::ItemPy::Type), &object)&& object) { Assembly::Item* Item = static_cast(object)->getItemPtr(); // Should be set! - assert(Item); + assert(Item); - // get the gui document of the Assembly Item + // get the gui document of the Assembly Item ActiveAsmObject = Item; ActiveAppDoc = Item->getDocument(); ActiveGuiDoc = Gui::Application::Instance->getDocument(ActiveAppDoc); - ActiveVp = dynamic_cast (ActiveGuiDoc->getViewProvider(Item)) ; + ActiveVp = dynamic_cast(ActiveGuiDoc->getViewProvider(Item)) ; ActiveGuiDoc->signalHighlightObject(*ActiveVp,Gui::Blue,true); } Py_Return; } +static PyObject* clearActiveAssembly(PyObject* self, PyObject* args) { + + ActiveAsmObject = 0; + ActiveGuiDoc =0; + ActiveAppDoc =0; + ActiveVp =0; + + Py_Return; +} + /* module functions */ -static PyObject * getActiveAssembly(PyObject *self, PyObject *args) -{ - if(ActiveAsmObject){ - +static PyObject* getActiveAssembly(PyObject* self, PyObject* args) +{ + if(ActiveAsmObject) { + return ActiveAsmObject->getPyObject(); } @@ -94,10 +104,15 @@ static PyObject * getActiveAssembly(PyObject *self, PyObject *args) /* registration table */ struct PyMethodDef AssemblyGui_Import_methods[] = { - {"setActiveAssembly" ,setActiveAssembly ,METH_VARARGS, - "setActiveAssembly(AssemblyObject) -- Set the Assembly object in work."}, - {"getActiveAssembly" ,getActiveAssembly ,METH_VARARGS, - "getActiveAssembly() -- Returns the Assembly object in work."}, + { "setActiveAssembly" ,setActiveAssembly ,METH_VARARGS, + "setActiveAssembly(AssemblyObject) -- Set the Assembly object in work." + }, + { "getActiveAssembly" ,getActiveAssembly ,METH_VARARGS, + "getActiveAssembly() -- Returns the Assembly object in work." + }, + { "clearActiveAssembly" ,clearActiveAssembly ,METH_VARARGS, + "clearActiveAssembly() -- Removes the current active Assembly as object in work" + }, {NULL, NULL} /* end of table marker */ }; diff --git a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp index 8cdb3fe57..301e569d6 100644 --- a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp +++ b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp @@ -35,6 +35,8 @@ using namespace AssemblyGui; +extern Assembly::ItemAssembly* ActiveAsmObject; + PROPERTY_SOURCE(AssemblyGui::ViewProviderItemAssembly,AssemblyGui::ViewProviderItem) ViewProviderItemAssembly::ViewProviderItemAssembly() @@ -43,6 +45,8 @@ ViewProviderItemAssembly::ViewProviderItemAssembly() ViewProviderItemAssembly::~ViewProviderItemAssembly() { + if(getObject() == ActiveAsmObject) + Gui::Command::doCommand(Gui::Command::Doc,"AssemblyGui.clearActiveAssembly()"); } bool ViewProviderItemAssembly::doubleClicked(void)