diff --git a/src/Mod/Fem/Gui/ActiveAnalysisObserver.cpp b/src/Mod/Fem/Gui/ActiveAnalysisObserver.cpp new file mode 100644 index 000000000000..4d28fd3160a2 --- /dev/null +++ b/src/Mod/Fem/Gui/ActiveAnalysisObserver.cpp @@ -0,0 +1,112 @@ +/*************************************************************************** + * Copyright (c) 2013 Werner Mayer * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 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 Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#include "PreCompiled.h" +#include "ActiveAnalysisObserver.h" +#include +#include +#include +#include + +using namespace FemGui; + + +ActiveAnalysisObserver* ActiveAnalysisObserver::inst = 0; + +ActiveAnalysisObserver* ActiveAnalysisObserver::instance() +{ + if (!inst) + inst = new ActiveAnalysisObserver(); + return inst; +} + +ActiveAnalysisObserver::ActiveAnalysisObserver() + : activeObject(0), activeView(0), activeDocument(0) +{ +} + +ActiveAnalysisObserver::~ActiveAnalysisObserver() +{ +} + +void ActiveAnalysisObserver::setActiveObject(Fem::FemAnalysis* fem) +{ + if (fem) { + activeObject = fem; + App::Document* doc = fem->getDocument(); + activeDocument = Gui::Application::Instance->getDocument(doc); + activeView = static_cast(activeDocument->getViewProvider(activeObject)); + attachDocument(doc); + } + else { + activeObject = 0; + activeView = 0; + } +} + +Fem::FemAnalysis* ActiveAnalysisObserver::getActiveObject() const +{ + return activeObject; +} + +bool ActiveAnalysisObserver::hasActiveObject() const +{ + return activeObject != 0; +} + +void ActiveAnalysisObserver::highlightActiveObject(const Gui::HighlightMode& mode, bool on) +{ + if (activeDocument && activeView) + activeDocument->signalHighlightObject(*activeView, mode, on); +} + +void ActiveAnalysisObserver::slotCreatedDocument(const App::Document& Doc) +{ +} + +void ActiveAnalysisObserver::slotDeletedDocument(const App::Document& Doc) +{ + App::Document* d = getDocument(); + if (d == &Doc) { + activeObject = 0; + activeDocument = 0; + activeView = 0; + detachDocument(); + } +} + +void ActiveAnalysisObserver::slotCreatedObject(const App::DocumentObject& Obj) +{ +} + +void ActiveAnalysisObserver::slotDeletedObject(const App::DocumentObject& Obj) +{ + if (activeObject == &Obj) { + activeObject = 0; + activeView = 0; + } +} + +void ActiveAnalysisObserver::slotChangedObject(const App::DocumentObject& Obj, const App::Property& Prop) +{ +} diff --git a/src/Mod/Fem/Gui/ActiveAnalysisObserver.h b/src/Mod/Fem/Gui/ActiveAnalysisObserver.h new file mode 100644 index 000000000000..28987d3c0d2e --- /dev/null +++ b/src/Mod/Fem/Gui/ActiveAnalysisObserver.h @@ -0,0 +1,68 @@ +/*************************************************************************** + * Copyright (c) 2013 Werner Mayer * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 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 Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#ifndef FEMGUI_ACTIVEANALYSISOBSERVER_H +#define FEMGUI_ACTIVEANALYSISOBSERVER_H + +#include +#include + +namespace Gui { + class Document; + class ViewProviderDocumentObject; +} + +namespace Fem { class FemAnalysis; } + +namespace FemGui { + +class ActiveAnalysisObserver : public App::DocumentObserver +{ +public: + static ActiveAnalysisObserver* instance(); + + void setActiveObject(Fem::FemAnalysis*); + Fem::FemAnalysis* getActiveObject() const; + bool hasActiveObject() const; + void highlightActiveObject(const Gui::HighlightMode&, bool); + +private: + ActiveAnalysisObserver(); + ~ActiveAnalysisObserver(); + + void slotCreatedDocument(const App::Document& Doc); + void slotDeletedDocument(const App::Document& Doc); + void slotCreatedObject(const App::DocumentObject& Obj); + void slotDeletedObject(const App::DocumentObject& Obj); + void slotChangedObject(const App::DocumentObject& Obj, const App::Property& Prop); + +private: + static ActiveAnalysisObserver* inst; + Fem::FemAnalysis* activeObject; + Gui::ViewProviderDocumentObject* activeView; + Gui::Document* activeDocument; +}; + +} //namespace FemGui + +#endif // FEMGUI_ACTIVEANALYSISOBSERVER_H diff --git a/src/Mod/Fem/Gui/AppFemGuiPy.cpp b/src/Mod/Fem/Gui/AppFemGuiPy.cpp index d09efc5b0994..e75629c934cd 100755 --- a/src/Mod/Fem/Gui/AppFemGuiPy.cpp +++ b/src/Mod/Fem/Gui/AppFemGuiPy.cpp @@ -29,51 +29,31 @@ #include #include #include -#include #include #include - - -// pointer to the active Analysis object -Fem::FemAnalysis *ActiveAnalysis =0; -Gui::Document *ActiveGuiDoc =0; -App::Document *ActiveAppDoc =0; -Gui::ViewProviderDocumentObject *ActiveVp =0; +#include "ActiveAnalysisObserver.h" /* module functions */ static PyObject * setActiveAnalysis(PyObject *self, PyObject *args) -{ - if(ActiveAnalysis){ - // 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){ - ActiveGuiDoc->signalHighlightObject(*ActiveVp,Gui::Blue,false); - break; - } - - ActiveAnalysis = 0; - ActiveGuiDoc =0; - ActiveAppDoc =0; - ActiveVp =0; +{ + if (FemGui::ActiveAnalysisObserver::instance()->hasActiveObject()) { + FemGui::ActiveAnalysisObserver::instance()->highlightActiveObject(Gui::Blue,false); + FemGui::ActiveAnalysisObserver::instance()->setActiveObject(0); } PyObject *object=0; if (PyArg_ParseTuple(args,"|O!",&(App::DocumentObjectPy::Type), &object)&& object) { App::DocumentObject* obj = static_cast(object)->getDocumentObjectPtr(); - if(!obj || !obj->getTypeId().isDerivedFrom(Fem::FemAnalysis::getClassTypeId()) ){ + if (!obj || !obj->getTypeId().isDerivedFrom(Fem::FemAnalysis::getClassTypeId())){ PyErr_SetString(PyExc_Exception, "Active Analysis object have to be of type Fem::FemAnalysis!"); return 0; } - // get the gui document of the Analysis Item - ActiveAnalysis = static_cast(obj); - ActiveAppDoc = ActiveAnalysis->getDocument(); - ActiveGuiDoc = Gui::Application::Instance->getDocument(ActiveAppDoc); - ActiveVp = dynamic_cast (ActiveGuiDoc->getViewProvider(ActiveAnalysis)) ; - ActiveGuiDoc->signalHighlightObject(*ActiveVp,Gui::Blue,true); + // get the gui document of the Analysis Item + FemGui::ActiveAnalysisObserver::instance()->setActiveObject(static_cast(obj)); + FemGui::ActiveAnalysisObserver::instance()->highlightActiveObject(Gui::Blue,true); } Py_Return; @@ -81,13 +61,11 @@ static PyObject * setActiveAnalysis(PyObject *self, PyObject *args) /* module functions */ static PyObject * getActiveAnalysis(PyObject *self, PyObject *args) -{ - if(ActiveAnalysis){ - - return ActiveAnalysis->getPyObject(); +{ + if (FemGui::ActiveAnalysisObserver::instance()->hasActiveObject()) { + return FemGui::ActiveAnalysisObserver::instance()->getActiveObject()->getPyObject(); } - Py_Return; } diff --git a/src/Mod/Fem/Gui/CMakeLists.txt b/src/Mod/Fem/Gui/CMakeLists.txt index 12b341317bd2..e22f858c31e2 100755 --- a/src/Mod/Fem/Gui/CMakeLists.txt +++ b/src/Mod/Fem/Gui/CMakeLists.txt @@ -51,11 +51,11 @@ set(FemGui_MOC_HDRS TaskFemConstraintForce.h TaskFemConstraintGear.h TaskFemConstraintPulley.h - TaskTetParameter.h - TaskAnalysisInfo.h - TaskDriver.h - TaskDlgAnalysis.h - TaskDlgMeshShapeNetgen.h + TaskTetParameter.h + TaskAnalysisInfo.h + TaskDriver.h + TaskDlgAnalysis.h + TaskDlgMeshShapeNetgen.h ) fc_wrap_cpp(FemGui_MOC_SRCS ${FemGui_MOC_HDRS}) SOURCE_GROUP("Moc" FILES ${FemGui_MOC_SRCS}) @@ -68,9 +68,9 @@ set(FemGui_UIC_SRCS TaskFemConstraintBearing.ui TaskFemConstraintFixed.ui TaskFemConstraintForce.ui - TaskTetParameter.ui - TaskAnalysisInfo.ui - TaskDriver.ui + TaskTetParameter.ui + TaskAnalysisInfo.ui + TaskDriver.ui ) qt4_wrap_ui(FemGui_UIC_HDRS ${FemGui_UIC_SRCS}) @@ -168,6 +168,8 @@ SOURCE_GROUP("Task_Dialogs" FILES ${FemGui_SRCS_TaskDlg}) SET(FemGui_SRCS_Module AppFemGui.cpp AppFemGuiPy.cpp + ActiveAnalysisObserver.cpp + ActiveAnalysisObserver.h Command.cpp Resources/Fem.qrc PreCompiled.cpp diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index b0dd8ba06233..8e4a761afd3a 100755 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -59,16 +59,15 @@ #include "Hypothesis.h" +#include "ActiveAnalysisObserver.h" using namespace std; -extern Fem::FemAnalysis *ActiveAnalysis; - - bool getConstraintPrerequisits(Fem::FemAnalysis **Analysis) { - if(!ActiveAnalysis || !ActiveAnalysis->getTypeId().isDerivedFrom(Fem::FemAnalysis::getClassTypeId())){ + Fem::FemAnalysis* ActiveAnalysis = FemGui::ActiveAnalysisObserver::instance()->getActiveObject(); + if (!ActiveAnalysis || !ActiveAnalysis->getTypeId().isDerivedFrom(Fem::FemAnalysis::getClassTypeId())){ QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No active Analysis"), QObject::tr("You need to create or activate a Analysis")); return true; @@ -164,12 +163,11 @@ void CmdFemCreateAnalysis::activated(int iMsg) commitCommand(); updateActive(); - } bool CmdFemCreateAnalysis::isActive(void) { - return !ActiveAnalysis; + return !FemGui::ActiveAnalysisObserver::instance()->hasActiveObject(); }