diff --git a/src/Mod/Fem/Gui/AppFemGuiPy.cpp b/src/Mod/Fem/Gui/AppFemGuiPy.cpp index 5b1a9c91a..d09efc5b0 100755 --- a/src/Mod/Fem/Gui/AppFemGuiPy.cpp +++ b/src/Mod/Fem/Gui/AppFemGuiPy.cpp @@ -68,7 +68,7 @@ static PyObject * setActiveAnalysis(PyObject *self, PyObject *args) return 0; } - // get the gui document of the Assembly Item + // get the gui document of the Analysis Item ActiveAnalysis = static_cast(obj); ActiveAppDoc = ActiveAnalysis->getDocument(); ActiveGuiDoc = Gui::Application::Instance->getDocument(ActiveAppDoc); @@ -95,5 +95,9 @@ static PyObject * getActiveAnalysis(PyObject *self, PyObject *args) /* registration table */ struct PyMethodDef FemGui_Import_methods[] = { + {"setActiveAnalysis" ,setActiveAnalysis ,METH_VARARGS, + "setActiveAnalysis(AnalysisObject) -- Set the Analysis object in work."}, + {"getActiveAnalysis" ,getActiveAnalysis ,METH_VARARGS, + "getActiveAnalysis() -- Returns the Analysis object in work."}, {NULL, NULL} /* end of table marker */ }; diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index 4f347553c..f65d8c552 100755 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -54,11 +54,33 @@ #include #include #include +#include + #include "Hypothesis.h" using namespace std; + +extern Fem::FemAnalysis *ActiveAnalysis; + + +bool getConstraintPrerequisits(Fem::FemAnalysis **Analysis) +{ + 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; + } + + *Analysis = static_cast(ActiveAnalysis); + + // return with no error + return false; + +} + + DEF_STD_CMD_A(CmdFemCreateFromShape); CmdFemCreateFromShape::CmdFemCreateFromShape() @@ -130,6 +152,9 @@ void CmdFemCreateAnalysis::activated(int iMsg) doCommand(Doc,"App.activeDocument().addObject('Fem::FemMeshShapeNetgenObject','%s')",MeshName.c_str()); doCommand(Doc,"App.activeDocument().ActiveObject.Shape = App.activeDocument().%s",base->getNameInDocument()); doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s",AnalysisName.c_str(),MeshName.c_str()); + addModule(Gui,"FemGui"); + doCommand(Gui,"FemGui.setActiveAnalysis(App.activeDocument().%s)",AnalysisName.c_str()); + updateActive(); } @@ -160,10 +185,16 @@ CmdFemConstraintBearing::CmdFemConstraintBearing() void CmdFemConstraintBearing::activated(int iMsg) { + Fem::FemAnalysis *Analysis; + + if(getConstraintPrerequisits(&Analysis)) + return; + std::string FeatName = getUniqueObjectName("FemConstraintBearing"); openCommand("Make FEM constraint for bearing"); doCommand(Doc,"App.activeDocument().addObject(\"Fem::ConstraintBearing\",\"%s\")",FeatName.c_str()); + doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]",Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); updateActive(); doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); @@ -192,10 +223,16 @@ CmdFemConstraintFixed::CmdFemConstraintFixed() void CmdFemConstraintFixed::activated(int iMsg) { + Fem::FemAnalysis *Analysis; + + if(getConstraintPrerequisits(&Analysis)) + return; + std::string FeatName = getUniqueObjectName("FemConstraintFixed"); openCommand("Make FEM constraint fixed geometry"); doCommand(Doc,"App.activeDocument().addObject(\"Fem::ConstraintFixed\",\"%s\")",FeatName.c_str()); + doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]",Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); updateActive(); doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); @@ -224,11 +261,17 @@ CmdFemConstraintForce::CmdFemConstraintForce() void CmdFemConstraintForce::activated(int iMsg) { + Fem::FemAnalysis *Analysis; + + if(getConstraintPrerequisits(&Analysis)) + return; + std::string FeatName = getUniqueObjectName("FemConstraintForce"); openCommand("Make FEM constraint force on geometry"); doCommand(Doc,"App.activeDocument().addObject(\"Fem::ConstraintForce\",\"%s\")",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Force = 0.0",FeatName.c_str()); + doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]",Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); updateActive(); doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); @@ -257,11 +300,16 @@ CmdFemConstraintGear::CmdFemConstraintGear() void CmdFemConstraintGear::activated(int iMsg) { + Fem::FemAnalysis *Analysis; + + if(getConstraintPrerequisits(&Analysis)) + return; std::string FeatName = getUniqueObjectName("FemConstraintGear"); openCommand("Make FEM constraint for gear"); doCommand(Doc,"App.activeDocument().addObject(\"Fem::ConstraintGear\",\"%s\")",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Diameter = 100.0",FeatName.c_str()); + doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]",Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); updateActive(); doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); @@ -290,6 +338,11 @@ CmdFemConstraintPulley::CmdFemConstraintPulley() void CmdFemConstraintPulley::activated(int iMsg) { + Fem::FemAnalysis *Analysis; + + if(getConstraintPrerequisits(&Analysis)) + return; + std::string FeatName = getUniqueObjectName("FemConstraintPulley"); openCommand("Make FEM constraint for pulley"); @@ -299,6 +352,7 @@ void CmdFemConstraintPulley::activated(int iMsg) doCommand(Doc,"App.activeDocument().%s.CenterDistance = 500.0",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.Force = 100.0",FeatName.c_str()); doCommand(Doc,"App.activeDocument().%s.TensionForce = 100.0",FeatName.c_str()); + doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().%s]",Analysis->getNameInDocument(),Analysis->getNameInDocument(),FeatName.c_str()); updateActive(); doCommand(Gui,"Gui.activeDocument().setEdit('%s')",FeatName.c_str()); @@ -318,6 +372,11 @@ DEF_STD_CMD_A(CmdFemDefineNodesSet); void DefineNodesCallback(void * ud, SoEventCallback * n) { + Fem::FemAnalysis *Analysis; + + if(getConstraintPrerequisits(&Analysis)) + return; + // show the wait cursor because this could take quite some time Gui::WaitCursor wc; @@ -374,6 +433,7 @@ void DefineNodesCallback(void * ud, SoEventCallback * n) Gui::Command::openCommand("Place robot"); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.addObject('Fem::FemSetNodesObject','NodeSet')"); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.ActiveObject.Nodes = %s",set.str().c_str()); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.Member = App.activeDocument().%s.Member + [App.activeDocument().NodeSet]",Analysis->getNameInDocument(),Analysis->getNameInDocument()); ////Gui::Command::updateActive(); Gui::Command::commitCommand(); diff --git a/src/Mod/Fem/Gui/ViewProviderAnalysis.cpp b/src/Mod/Fem/Gui/ViewProviderAnalysis.cpp index bcd82284a..5f60d121d 100644 --- a/src/Mod/Fem/Gui/ViewProviderAnalysis.cpp +++ b/src/Mod/Fem/Gui/ViewProviderAnalysis.cpp @@ -59,6 +59,13 @@ ViewProviderAnalysis::~ViewProviderAnalysis() } +bool ViewProviderAnalysis::doubleClicked(void) +{ + Gui::Command::assureWorkbench("FemWorkbench"); + Gui::Command::addModule(Gui::Command::Gui,"FemGui"); + Gui::Command::doCommand(Gui::Command::Gui,"FemGui.setActiveAnalysis(App.activeDocument().%s)",this->getObject()->getNameInDocument()); + return true; +} std::vector ViewProviderAnalysis::claimChildren(void)const { diff --git a/src/Mod/Fem/Gui/ViewProviderAnalysis.h b/src/Mod/Fem/Gui/ViewProviderAnalysis.h index b9821267a..221bfa39f 100644 --- a/src/Mod/Fem/Gui/ViewProviderAnalysis.h +++ b/src/Mod/Fem/Gui/ViewProviderAnalysis.h @@ -50,6 +50,8 @@ public: /// destructor. ~ViewProviderAnalysis(); + virtual bool doubleClicked(void); + virtual std::vector claimChildren(void)const; //virtual std::vector claimChildren3D(void)const;