From 80cf664ec8ea91352a18af40b4ea1fbcfb6ad821 Mon Sep 17 00:00:00 2001 From: Author qingfengxia Date: Fri, 13 Nov 2015 08:16:14 +0100 Subject: [PATCH] FEM: new solver object implementation of the object --- src/Mod/Fem/App/AppFem.cpp | 3 + src/Mod/Fem/App/CMakeLists.txt | 2 + src/Mod/Fem/App/FemSolverObject.cpp | 97 ++++++++++++++++++++++++ src/Mod/Fem/App/FemSolverObject.h | 85 +++++++++++++++++++++ src/Mod/Fem/Gui/AppFemGui.cpp | 3 + src/Mod/Fem/Gui/CMakeLists.txt | 2 + src/Mod/Fem/Gui/Command.cpp | 46 +++++++++++ src/Mod/Fem/Gui/ViewProviderAnalysis.cpp | 3 + src/Mod/Fem/Gui/ViewProviderSolver.cpp | 69 +++++++++++++++++ src/Mod/Fem/Gui/ViewProviderSolver.h | 65 ++++++++++++++++ 10 files changed, 375 insertions(+) create mode 100644 src/Mod/Fem/App/FemSolverObject.cpp create mode 100644 src/Mod/Fem/App/FemSolverObject.h create mode 100644 src/Mod/Fem/Gui/ViewProviderSolver.cpp create mode 100644 src/Mod/Fem/Gui/ViewProviderSolver.h diff --git a/src/Mod/Fem/App/AppFem.cpp b/src/Mod/Fem/App/AppFem.cpp index 4d3a2e24859a..1a6fc95ddd3e 100644 --- a/src/Mod/Fem/App/AppFem.cpp +++ b/src/Mod/Fem/App/AppFem.cpp @@ -52,6 +52,7 @@ #include "FemConstraintPulley.h" #include "FemResultObject.h" +#include "FemSolverObject.h" extern struct PyMethodDef Fem_methods[]; @@ -142,6 +143,8 @@ void AppFemExport initFem() Fem::FemResultObject ::init(); Fem::FemResultObjectPython ::init(); + Fem::FemSolverObject ::init(); + Fem::FemSolverObjectPython ::init(); } } // extern "C" diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 6305e5a273fd..381c60f71cdd 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -144,6 +144,8 @@ SET(FemBase_SRCS FemMesh.h FemResultObject.cpp FemResultObject.h + FemSolverObject.cpp + FemSolverObject.h FemConstraint.cpp FemConstraint.h FemMeshProperty.cpp diff --git a/src/Mod/Fem/App/FemSolverObject.cpp b/src/Mod/Fem/App/FemSolverObject.cpp new file mode 100644 index 000000000000..9bda9601adef --- /dev/null +++ b/src/Mod/Fem/App/FemSolverObject.cpp @@ -0,0 +1,97 @@ +/*************************************************************************** + * Copyright (c) 2013 J¨¹rgen Riegel (FreeCAD@juergen-riegel.net) * + * Copyright (c) 2015 Qingfeng Xia (FreeCAD@iesensor.com) * + * * + * 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" + +#ifndef _PreComp_ +#endif + +#include "FemSolverObject.h" + +#include +#include +#include + + +using namespace Fem; +using namespace App; + +PROPERTY_SOURCE(Fem::FemSolverObject, App::DocumentObject) + + +FemSolverObject::FemSolverObject() +{ + + ADD_PROPERTY_TYPE(SolverName,("Calculix"), "Data",Prop_None,"Solver program name"); + ADD_PROPERTY_TYPE(Category,("FEM"), "Data",Prop_None,"FEM, CFD ..."); + ADD_PROPERTY_TYPE(Module,(""), "Data",Prop_None,"Python module name"); + ADD_PROPERTY_TYPE(ExternalCaseEditor,(""), "Data",Prop_None,"External case editor programe"); + ADD_PROPERTY_TYPE(ExternalResultViewer,(""), "Data",Prop_None,"External result viewer name"); + + ADD_PROPERTY_TYPE(AnalysisType,("Static"), "Solver",Prop_None,"Specific analysis type"); + ADD_PROPERTY_TYPE(WorkingDir,(Base::FileInfo::getTempPath()), "Solver",Prop_None,"Solver working directory"); + ADD_PROPERTY_TYPE(InputCaseName,("TestCase"), "Solver",Prop_None,"Solver input file without suffix"); + ADD_PROPERTY_TYPE(Parallel,(false), "Solver",Prop_None,"Run solver in parallel like MPI"); + ADD_PROPERTY_TYPE(ResultObtained,(false), "Solver",Prop_None,"if true, result has been obtained"); +} + +FemSolverObject::~FemSolverObject() +{ +} + +short FemSolverObject::mustExecute(void) const +{ + return 0; +} + +PyObject *FemSolverObject::getPyObject() +{ + if (PythonObject.is(Py::_None())){ + // ref counter is set to 1 + PythonObject = Py::Object(new DocumentObjectPy(this),true); + } + return Py::new_reference_to(PythonObject); +} + +// Python feature --------------------------------------------------------- + +namespace App { +/// @cond DOXERR +PROPERTY_SOURCE_TEMPLATE(Fem::FemSolverObjectPython, Fem::FemSolverObject) +template<> const char* Fem::FemSolverObjectPython::getViewProviderName(void) const { + return "FemGui::ViewProviderSolverPython"; +} + +template<> PyObject* Fem::FemSolverObjectPython::getPyObject(void) { + if (PythonObject.is(Py::_None())) { + // ref counter is set to 1 + PythonObject = Py::Object(new App::FeaturePythonPyT(this),true); + } + return Py::new_reference_to(PythonObject); +} + +// explicit template instantiation +template class AppFemExport FeaturePythonT; + +} diff --git a/src/Mod/Fem/App/FemSolverObject.h b/src/Mod/Fem/App/FemSolverObject.h new file mode 100644 index 000000000000..fabd599ddbe4 --- /dev/null +++ b/src/Mod/Fem/App/FemSolverObject.h @@ -0,0 +1,85 @@ +/*************************************************************************** + * Copyright (c) 2013 Jürgen Riegel (FreeCAD@juergen-riegel.net) * + * Copyright (c) 2015 Qingfeng Xia (FreeCAD@iesensor.com) * + * * + * 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 Fem_FemSolverObject_H +#define Fem_FemSolverObject_H + +#include +#include +#include +#include +#include "FemSolverObject.h" + +namespace Fem +{ +/// Father of all result data in a Fem Analysis +class AppFemExport FemSolverObject : public App::DocumentObject +{ + PROPERTY_HEADER(Fem::FemSolverObject); + +public: + /// Constructor + FemSolverObject(void); + virtual ~FemSolverObject(); + + /// Solver name, unique to identify solver in registered_solver dict + App::PropertyString SolverName; + /// CAE category like FEM, all capitalised letters + App::PropertyString Category; + /// python module name + App::PropertyString Module; + /// Path or program name for external case editor, empty string means using FreeCAD to view + App::PropertyString ExternalCaseEditor; + /// Path to External Result Viewer like Paraview, empty string means using FreeCAD + App::PropertyString ExternalResultViewer; + + /// for FEM: Static, Frequency, etc + App::PropertyString AnalysisType; + /// Path of working dir for the solver + App::PropertyString WorkingDir; + /// name for the case file without suffix + App::PropertyString InputCaseName; + /// run parallel in MPI (message passing interface)/multiple cores or serial(single CPU) + App::PropertyBool Parallel; + /// result has been obtained, purge result may be needed for rerun + App::PropertyBool ResultObtained; + + /// returns the type name of the ViewProvider + virtual const char* getViewProviderName(void) const { + return "FemGui::ViewProviderSolver"; + } + virtual App::DocumentObjectExecReturn *execute(void) { + return App::DocumentObject::StdReturn; + } + virtual short mustExecute(void) const; + virtual PyObject *getPyObject(void); + +}; + +typedef App::FeaturePythonT FemSolverObjectPython; + +} //namespace Fem + + +#endif // Fem_FemSolverObject_H diff --git a/src/Mod/Fem/Gui/AppFemGui.cpp b/src/Mod/Fem/Gui/AppFemGui.cpp index 31170d47caec..37cf31b78735 100644 --- a/src/Mod/Fem/Gui/AppFemGui.cpp +++ b/src/Mod/Fem/Gui/AppFemGui.cpp @@ -37,6 +37,7 @@ #include "ViewProviderFemMeshShape.h" #include "ViewProviderFemMeshShapeNetgen.h" #include "ViewProviderAnalysis.h" +#include "ViewProviderSolver.h" #include "ViewProviderSetNodes.h" #include "ViewProviderSetElements.h" #include "ViewProviderSetFaces.h" @@ -88,6 +89,8 @@ void FemGuiExport initFemGui() FemGui::ViewProviderFemMesh ::init(); FemGui::ViewProviderFemMeshShape ::init(); FemGui::ViewProviderFemMeshShapeNetgen ::init(); + FemGui::ViewProviderSolver ::init(); + FemGui::ViewProviderSolverPython ::init(); FemGui::ViewProviderSetNodes ::init(); FemGui::ViewProviderSetElements ::init(); FemGui::ViewProviderSetFaces ::init(); diff --git a/src/Mod/Fem/Gui/CMakeLists.txt b/src/Mod/Fem/Gui/CMakeLists.txt index 157e7e5b3c15..c7e65e962e78 100755 --- a/src/Mod/Fem/Gui/CMakeLists.txt +++ b/src/Mod/Fem/Gui/CMakeLists.txt @@ -116,6 +116,8 @@ SET(FemGui_SRCS_ViewProvider ViewProviderFemMeshShapeNetgen.h ViewProviderAnalysis.cpp ViewProviderAnalysis.h + ViewProviderSolver.cpp + ViewProviderSolver.h ViewProviderSetNodes.cpp ViewProviderSetNodes.h ViewProviderSetElements.cpp diff --git a/src/Mod/Fem/Gui/Command.cpp b/src/Mod/Fem/Gui/Command.cpp index 5c6f03a4c7dc..20fd1b66b1d1 100644 --- a/src/Mod/Fem/Gui/Command.cpp +++ b/src/Mod/Fem/Gui/Command.cpp @@ -207,6 +207,51 @@ bool CmdFemAddPart::isActive(void) //===================================================================================== +DEF_STD_CMD_A(CmdFemCreateSolver); + +CmdFemCreateSolver::CmdFemCreateSolver() + : Command("Fem_CreateSolver") +{ + sAppModule = "Fem"; + sGroup = QT_TR_NOOP("Fem"); + sMenuText = QT_TR_NOOP("Add a solver to the Analysis"); + sToolTipText = QT_TR_NOOP("Add a solver to the Analysis"); + sWhatsThis = "Fem_CreateSolver"; + sStatusTip = sToolTipText; + sPixmap = "fem-solver"; +} + +void CmdFemCreateSolver::activated(int iMsg) +{ +#ifndef FCWithNetgen + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), + QObject::tr("Your FreeCAD is build without NETGEN support. Meshing will not work....")); + return; +#endif + + Fem::FemAnalysis *Analysis; + + if(getConstraintPrerequisits(&Analysis)) + return; + + std::string FeatName = getUniqueObjectName("Solver"); + + openCommand("Create solver for FEM or CFD analysis"); + doCommand(Doc,"App.activeDocument().addObject(\"Fem::FemSolverObject\",\"%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()); +} + +bool CmdFemCreateSolver::isActive(void) +{ + return hasActiveDocument(); +} + +//===================================================================================== + + DEF_STD_CMD_A(CmdFemConstraintBearing); CmdFemConstraintBearing::CmdFemConstraintBearing() @@ -643,6 +688,7 @@ void CreateFemCommands(void) Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager(); //rcCmdMgr.addCommand(new CmdFemCreateAnalysis()); rcCmdMgr.addCommand(new CmdFemAddPart()); + //rcCmdMgr.addCommand(new CmdFemCreateSolver()); // Solver will be extended and created in python rcCmdMgr.addCommand(new CmdFemCreateNodesSet()); rcCmdMgr.addCommand(new CmdFemDefineNodesSet()); rcCmdMgr.addCommand(new CmdFemConstraintBearing()); diff --git a/src/Mod/Fem/Gui/ViewProviderAnalysis.cpp b/src/Mod/Fem/Gui/ViewProviderAnalysis.cpp index 6d4f3aa16450..53d1d0ee0dff 100644 --- a/src/Mod/Fem/Gui/ViewProviderAnalysis.cpp +++ b/src/Mod/Fem/Gui/ViewProviderAnalysis.cpp @@ -37,6 +37,7 @@ #include #include +#include #include #include #include @@ -164,6 +165,8 @@ bool ViewProviderFemAnalysis::canDragObject(App::DocumentObject* obj) const return false; if (obj->getTypeId().isDerivedFrom(Fem::FemMeshObject::getClassTypeId())) return true; + else if (obj->getTypeId().isDerivedFrom(Fem::FemSolverObject::getClassTypeId())) + return true; else if (obj->getTypeId().isDerivedFrom(Fem::Constraint::getClassTypeId())) return true; else if (obj->getTypeId().isDerivedFrom(Fem::FemSetObject::getClassTypeId())) diff --git a/src/Mod/Fem/Gui/ViewProviderSolver.cpp b/src/Mod/Fem/Gui/ViewProviderSolver.cpp new file mode 100644 index 000000000000..89cdc86f82c8 --- /dev/null +++ b/src/Mod/Fem/Gui/ViewProviderSolver.cpp @@ -0,0 +1,69 @@ +/*************************************************************************** + * Copyright (c) 2013 Jürgen Riegel (FreeCAD@juergen-riegel.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" + +#ifndef _PreComp_ +# include + +#endif + +#include "ViewProviderSolver.h" +#include +#include +#include + +#include + +#include "TaskDlgAnalysis.h" + +using namespace FemGui; + + + +PROPERTY_SOURCE(FemGui::ViewProviderSolver, Gui::ViewProviderDocumentObject) + + +ViewProviderSolver::ViewProviderSolver() +{ + sPixmap = "fem-solver"; + +} + +ViewProviderSolver::~ViewProviderSolver() +{ + +} + + + +// Python feature ----------------------------------------------------------------------- + +namespace Gui { +/// @cond DOXERR +PROPERTY_SOURCE_TEMPLATE(FemGui::ViewProviderSolverPython, FemGui::ViewProviderSolver) +/// @endcond + +// explicit template instantiation +template class FemGuiExport ViewProviderPythonFeatureT; +} diff --git a/src/Mod/Fem/Gui/ViewProviderSolver.h b/src/Mod/Fem/Gui/ViewProviderSolver.h new file mode 100644 index 000000000000..93001d5fa8e7 --- /dev/null +++ b/src/Mod/Fem/Gui/ViewProviderSolver.h @@ -0,0 +1,65 @@ +/*************************************************************************** + * Copyright (c) 2013 Jürgen Riegel (FreeCAD@juergen-riegel.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 FEM_ViewProviderSolver_H +#define FEM_ViewProviderSolver_H + +#include +#include +#include + +class SoCoordinate3; +class SoDrawStyle; +class SoIndexedFaceSet; +class SoIndexedLineSet; +class SoShapeHints; +class SoMaterialBinding; + +namespace FemGui +{ + + + +class FemGuiExport ViewProviderSolver : public Gui::ViewProviderDocumentObject +{ + PROPERTY_HEADER(FemGui::ViewProviderSolver); + +public: + /// constructor + ViewProviderSolver(); + + /// destructor + ~ViewProviderSolver(); + + // shows solid in the tree + virtual bool isShow(void) const{return true;} +protected: + +}; + +typedef Gui::ViewProviderPythonFeatureT ViewProviderSolverPython; + +} //namespace FemGui + + +#endif // FEM_ViewProviderSolver_H