Skip to content

Commit

Permalink
+ Implement observer for active analysis object
Browse files Browse the repository at this point in the history
  • Loading branch information
wwmayer committed Nov 8, 2013
1 parent 44e70a6 commit 09b896f
Show file tree
Hide file tree
Showing 5 changed files with 206 additions and 48 deletions.
112 changes: 112 additions & 0 deletions src/Mod/Fem/Gui/ActiveAnalysisObserver.cpp
@@ -0,0 +1,112 @@
/***************************************************************************
* Copyright (c) 2013 Werner Mayer <wmayer[at]users.sourceforge.net> *
* *
* 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 <Gui/Application.h>
#include <Gui/Document.h>
#include <Gui/ViewProviderDocumentObject.h>
#include <Mod/Fem/App/FemAnalysis.h>

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<Gui::ViewProviderDocumentObject *>(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)
{
}
68 changes: 68 additions & 0 deletions src/Mod/Fem/Gui/ActiveAnalysisObserver.h
@@ -0,0 +1,68 @@
/***************************************************************************
* Copyright (c) 2013 Werner Mayer <wmayer[at]users.sourceforge.net> *
* *
* 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 <App/DocumentObserver.h>
#include <Gui/Tree.h>

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
46 changes: 12 additions & 34 deletions src/Mod/Fem/Gui/AppFemGuiPy.cpp
Expand Up @@ -29,65 +29,43 @@
#include <App/DocumentObjectPy.h>
#include <Gui/Application.h>
#include <Gui/Document.h>
#include <Gui/Tree.h>
#include <Gui/ViewProviderDocumentObject.h>

#include <Mod/Fem/App/FemAnalysis.h>


// 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<App::Document*> docs = App::GetApplication().getDocuments();
for(std::vector<App::Document*>::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<App::DocumentObjectPy*>(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<Fem::FemAnalysis*>(obj);
ActiveAppDoc = ActiveAnalysis->getDocument();
ActiveGuiDoc = Gui::Application::Instance->getDocument(ActiveAppDoc);
ActiveVp = dynamic_cast<Gui::ViewProviderDocumentObject*> (ActiveGuiDoc->getViewProvider(ActiveAnalysis)) ;
ActiveGuiDoc->signalHighlightObject(*ActiveVp,Gui::Blue,true);
// get the gui document of the Analysis Item
FemGui::ActiveAnalysisObserver::instance()->setActiveObject(static_cast<Fem::FemAnalysis*>(obj));
FemGui::ActiveAnalysisObserver::instance()->highlightActiveObject(Gui::Blue,true);
}

Py_Return;
}

/* 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;
}

Expand Down
18 changes: 10 additions & 8 deletions src/Mod/Fem/Gui/CMakeLists.txt
Expand Up @@ -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})
Expand All @@ -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})

Expand Down Expand Up @@ -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
Expand Down
10 changes: 4 additions & 6 deletions src/Mod/Fem/Gui/Command.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -164,12 +163,11 @@ void CmdFemCreateAnalysis::activated(int iMsg)
commitCommand();

updateActive();

}

bool CmdFemCreateAnalysis::isActive(void)
{
return !ActiveAnalysis;
return !FemGui::ActiveAnalysisObserver::instance()->hasActiveObject();
}


Expand Down

0 comments on commit 09b896f

Please sign in to comment.