From 6865e35fd99ae1de782964e7d37f15de90cf06b3 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Sun, 15 Nov 2015 20:48:23 +0100 Subject: [PATCH] FEM: add CalculiX solver object --- src/Mod/Fem/App/CMakeLists.txt | 4 + src/Mod/Fem/App/FemSolverObject.cpp | 2 + src/Mod/Fem/App/FemSolverObject.h | 2 + src/Mod/Fem/CMakeLists.txt | 5 ++ src/Mod/Fem/FemSolverCalculix.py | 39 +++++++++ src/Mod/Fem/FemTools.py | 30 ++++--- src/Mod/Fem/Gui/Workbench.cpp | 2 + src/Mod/Fem/InitGui.py | 1 + src/Mod/Fem/_CommandFemSolverCalculix.py | 53 ++++++++++++ src/Mod/Fem/_FemAnalysis.py | 23 ----- src/Mod/Fem/_FemSolverCalculix.py | 75 +++++++++++++++++ src/Mod/Fem/_TaskPanelJobControl.py | 28 +++---- src/Mod/Fem/_ViewProviderFemAnalysis.py | 4 - src/Mod/Fem/_ViewProviderFemSolverCalculix.py | 83 +++++++++++++++++++ 14 files changed, 299 insertions(+), 52 deletions(-) create mode 100644 src/Mod/Fem/FemSolverCalculix.py create mode 100644 src/Mod/Fem/_CommandFemSolverCalculix.py create mode 100644 src/Mod/Fem/_FemSolverCalculix.py create mode 100644 src/Mod/Fem/_ViewProviderFemSolverCalculix.py diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 381c60f71..bb00e3dfd 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -73,6 +73,7 @@ SET(FemScripts_SRCS _CommandFemBeamSection.py _CommandFemFromShape.py _CommandFemShellThickness.py + _CommandFemSolverCalculix.py _CommandMechanicalJobControl.py _CommandMechanicalMaterial.py _CommandMechanicalShowResult.py @@ -82,6 +83,7 @@ SET(FemScripts_SRCS _FemAnalysis.py _FemBeamSection.py _FemShellThickness.py + _FemSolverCalculix.py _MechanicalMaterial.py _TaskPanelFemBeamSection.py _TaskPanelFemShellThickness.py @@ -91,6 +93,7 @@ SET(FemScripts_SRCS _ViewProviderFemAnalysis.py _ViewProviderFemBeamSection.py _ViewProviderFemShellThickness.py + _ViewProviderFemSolverCalculix.py _ViewProviderMechanicalMaterial.py ccxDatReader.py ccxFrdReader.py @@ -102,6 +105,7 @@ SET(FemScripts_SRCS FemBeamSection.py FemExample.py FemShellThickness.py + FemSolverCalculix.py FemTools.py MechanicalAnalysis.py MechanicalMaterial.py diff --git a/src/Mod/Fem/App/FemSolverObject.cpp b/src/Mod/Fem/App/FemSolverObject.cpp index 9bda9601a..47247a0c5 100644 --- a/src/Mod/Fem/App/FemSolverObject.cpp +++ b/src/Mod/Fem/App/FemSolverObject.cpp @@ -43,6 +43,7 @@ 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"); @@ -54,6 +55,7 @@ FemSolverObject::FemSolverObject() 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() diff --git a/src/Mod/Fem/App/FemSolverObject.h b/src/Mod/Fem/App/FemSolverObject.h index fabd599dd..7a91acfc7 100644 --- a/src/Mod/Fem/App/FemSolverObject.h +++ b/src/Mod/Fem/App/FemSolverObject.h @@ -43,6 +43,7 @@ public: FemSolverObject(void); virtual ~FemSolverObject(); + /* /// Solver name, unique to identify solver in registered_solver dict App::PropertyString SolverName; /// CAE category like FEM, all capitalised letters @@ -64,6 +65,7 @@ public: 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 { diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 5feb2383e..9f1349f14 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -62,6 +62,11 @@ INSTALL( _TaskPanelMechanicalMaterial.py TaskPanelMechanicalMaterial.ui + FemSolverCalculix.py + _FemSolverCalculix.py + _ViewProviderFemSolverCalculix.py + _CommandFemSolverCalculix.py + DESTINATION Mod/Fem ) diff --git a/src/Mod/Fem/FemSolverCalculix.py b/src/Mod/Fem/FemSolverCalculix.py new file mode 100644 index 000000000..d081c3df5 --- /dev/null +++ b/src/Mod/Fem/FemSolverCalculix.py @@ -0,0 +1,39 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2015 - Bernd Hahnebach * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program 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 program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "FemSolverCalculix" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + + +import FreeCAD +import _FemSolverCalculix + + +def makeFemSolverCalculix(name="Calculix"): + '''makeSolverCalculix(name): makes a Calculix solver object''' + obj = FreeCAD.ActiveDocument.addObject("Fem::FemSolverObjectPython", name) + _FemSolverCalculix._FemSolverCalculix(obj) + if FreeCAD.GuiUp: + import _ViewProviderFemSolverCalculix + _ViewProviderFemSolverCalculix._ViewProviderFemSolverCalculix(obj.ViewObject) + return obj diff --git a/src/Mod/Fem/FemTools.py b/src/Mod/Fem/FemTools.py index f029da64f..80dd6c4b6 100644 --- a/src/Mod/Fem/FemTools.py +++ b/src/Mod/Fem/FemTools.py @@ -50,15 +50,18 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): self.analysis = FemGui.getActiveAnalysis() if self.analysis: self.update_objects() - self.set_analysis_type() - self.set_eigenmode_parameters() ## @var base_name # base name of .inp/.frd file (without extension). It is used to construct .inp file path that is passed to CalculiX ccx self.base_name = "" ## @var results_present # boolean variable indicating if there are calculation results ready for use self.results_present = False - self.setup_working_dir() + if self.solver: + self.set_analysis_type() + self.set_eigenmode_parameters() + self.setup_working_dir() + else: + raise Exception('FEM: No solver found!') if test_mode: self.ccx_binary_present = True else: @@ -149,6 +152,9 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): # [{'Object':beam_sections, 'xxxxxxxx':value}, {}, ...] # [{'Object':shell_thicknesses, 'xxxxxxxx':value}, {}, ...] + ## @var solver + # solver of the analysis. Used to store solver and analysis parameters + self.solver = None ## @var mesh # mesh of the analysis. Used to generate .inp file and to show results self.mesh = None @@ -178,7 +184,9 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): self.shell_thicknesses = [] for m in self.analysis.Member: - if m.isDerivedFrom("Fem::FemMeshObject"): + if m.isDerivedFrom("Fem::FemSolverObjectPython"): + self.solver = m + elif m.isDerivedFrom("Fem::FemMeshObject"): self.mesh = m elif m.isDerivedFrom("App::MaterialObjectPython"): material_dict = {} @@ -299,7 +307,7 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): _number = number else: try: - _number = self.analysis.NumberOfEigenmodes + _number = self.solver.NumberOfEigenmodes except: #Not yet in prefs, so it will always default to 10 _number = self.fem_prefs.GetInteger("NumberOfEigenmodes", 10) @@ -310,7 +318,7 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): _limit_low = limit_low else: try: - _limit_low = self.analysis.EigenmodeLowLimit + _limit_low = self.solver.EigenmodeLowLimit except: #Not yet in prefs, so it will always default to 0.0 _limit_low = self.fem_prefs.GetFloat("EigenmodeLowLimit", 0.0) @@ -319,7 +327,7 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): _limit_high = limit_high else: try: - _limit_high = self.analysis.EigenmodeHighLimit + _limit_high = self.solver.EigenmodeHighLimit except: #Not yet in prefs, so it will always default to 1000000.0 _limit_high = self.fem_prefs.GetFloat("EigenmodeHighLimit", 1000000.0) @@ -357,21 +365,21 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): self.analysis_type = analysis_type else: try: - self.analysis_type = self.analysis.AnalysisType + self.analysis_type = self.solver.AnalysisType except: self.fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem") self.analysis_type = self.fem_prefs.GetString("AnalysisType", "static") - ## Sets working dir for ccx execution. Called with no working_dir uses WorkingDir from FEM preferences + ## Sets working dir for solver execution. Called with no working_dir uses WorkingDir from FEM preferences # @param self The python object self - # @working_dir directory to be used for writing .inp file and executing CalculiX ccx + # @working_dir directory to be used for writing solver input file or files and executing solver def setup_working_dir(self, working_dir=None): import os if working_dir is not None: self.working_dir = working_dir else: try: - self.working_dir = self.analysis.WorkingDir + self.working_dir = self.solver.WorkingDir except: FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem").GetString("WorkingDir") self.working_dir = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem").GetString("WorkingDir") diff --git a/src/Mod/Fem/Gui/Workbench.cpp b/src/Mod/Fem/Gui/Workbench.cpp index bfbd96197..d3811c4fc 100755 --- a/src/Mod/Fem/Gui/Workbench.cpp +++ b/src/Mod/Fem/Gui/Workbench.cpp @@ -56,6 +56,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const Gui::ToolBarItem* fem = new Gui::ToolBarItem(root); fem->setCommand("FEM"); *fem << "Fem_NewMechanicalAnalysis" + << "Fem_SolverCalculix" << "Fem_CreateFromShape" << "Fem_MechanicalMaterial" << "Fem_BeamSection" @@ -85,6 +86,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const root->insertItem(item, fem); fem->setCommand("&FEM"); *fem << "Fem_NewMechanicalAnalysis" + << "Fem_SolverCalculix" << "Fem_CreateFromShape" << "Fem_MechanicalMaterial" << "Fem_BeamSection" diff --git a/src/Mod/Fem/InitGui.py b/src/Mod/Fem/InitGui.py index c40d425ed..e7af375bc 100644 --- a/src/Mod/Fem/InitGui.py +++ b/src/Mod/Fem/InitGui.py @@ -51,6 +51,7 @@ class FemWorkbench (Workbench): import _CommandFemShellThickness import _CommandFemBeamSection import _CommandMechanicalMaterial + import _CommandFemSolverCalculix import MechanicalAnalysis diff --git a/src/Mod/Fem/_CommandFemSolverCalculix.py b/src/Mod/Fem/_CommandFemSolverCalculix.py new file mode 100644 index 000000000..2713e3d13 --- /dev/null +++ b/src/Mod/Fem/_CommandFemSolverCalculix.py @@ -0,0 +1,53 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2015 - Bernd Hahnebach * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program 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 program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "_CommandFemSolverCalculix" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + + +import FreeCAD +from FemCommands import FemCommands + +if FreeCAD.GuiUp: + import FreeCADGui + from PySide import QtCore + + +class _CommandFemSolverCalculix(FemCommands): + "The Fem_SolverCalculix command definition" + def __init__(self): + super(_CommandFemSolverCalculix, self).__init__() + self.resources = {'Pixmap': 'fem-solver', + 'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_SolverCalculix", "Create FEM Solver Calculix ..."), + 'Accel': "S, C", + 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_SolverCalculix", "Creates FEM Solver Calculix")} + self.is_active = 'with_analysis' + + def Activated(self): + FreeCAD.ActiveDocument.openTransaction("Create SolverCalculix") + FreeCADGui.addModule("FemSolverCalculix") + FreeCADGui.doCommand("FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [FemSolverCalculix.makeFemSolverCalculix()]") + + +if FreeCAD.GuiUp: + FreeCADGui.addCommand('Fem_SolverCalculix', _CommandFemSolverCalculix()) diff --git a/src/Mod/Fem/_FemAnalysis.py b/src/Mod/Fem/_FemAnalysis.py index 28454b91b..cee1cc36b 100644 --- a/src/Mod/Fem/_FemAnalysis.py +++ b/src/Mod/Fem/_FemAnalysis.py @@ -24,35 +24,12 @@ __title__ = "Fem Analysis" __author__ = "Juergen Riegel" __url__ = "http://www.freecadweb.org" -import FreeCAD -from FemTools import FemTools - class _FemAnalysis: "The FemAnalysis container object" def __init__(self, obj): self.Type = "FemAnalysis" obj.Proxy = self - fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem") - obj.addProperty("App::PropertyEnumeration", "AnalysisType", "Fem", "Type of the analysis") - obj.AnalysisType = FemTools.known_analysis_types - analysis_type = fem_prefs.GetInt("AnalysisType", 0) - obj.AnalysisType = FemTools.known_analysis_types[analysis_type] - obj.addProperty("App::PropertyPath", "WorkingDir", "Fem", "Working directory for calculations") - obj.WorkingDir = fem_prefs.GetString("WorkingDir", "") - - obj.addProperty("App::PropertyIntegerConstraint", "NumberOfEigenmodes", "Fem", "Number of modes for frequency calculations") - noe = fem_prefs.GetInt("NumberOfEigenmodes", 10) - obj.NumberOfEigenmodes = (noe, 1, 100, 1) - - obj.addProperty("App::PropertyFloatConstraint", "EigenmodeLowLimit", "Fem", "Low frequency limit for eigenmode calculations") - #Not yet in prefs, so it will always default to 0.0 - ell = fem_prefs.GetFloat("EigenmodeLowLimit", 0.0) - obj.EigenmodeLowLimit = (ell, 0.0, 1000000.0, 10000.0) - - obj.addProperty("App::PropertyFloatConstraint", "EigenmodeHighLimit", "Fem", "High frequency limit for eigenmode calculations") - ehl = fem_prefs.GetFloat("EigenmodeHighLimit", 1000000.0) - obj.EigenmodeHighLimit = (ehl, 0.0, 1000000.0, 10000.0) def execute(self, obj): return diff --git a/src/Mod/Fem/_FemSolverCalculix.py b/src/Mod/Fem/_FemSolverCalculix.py new file mode 100644 index 000000000..4542ecb89 --- /dev/null +++ b/src/Mod/Fem/_FemSolverCalculix.py @@ -0,0 +1,75 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2015 - Bernd Hahnebach * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program 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 program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "_FemSolverCalculix" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + + +import FreeCAD +from FemTools import FemTools + + +class _FemSolverCalculix(): + """The Fem::FemSolver's Proxy python type, add solver specific properties + """ + def __init__(self, obj): + self.Type = "FemSolverCalculix" + self.Object = obj # keep a ref to the DocObj for nonGui usage + obj.Proxy = self # link between App::DocumentObject to this object + + obj.addProperty("App::PropertyString", "SolverType", "Base", "Type of the solver") + obj.SolverType = str(self.Type) + obj.setEditorMode("SolverType", 1) + + fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem") + + obj.addProperty("App::PropertyPath", "WorkingDir", "Fem", "Working directory for calculations") + obj.WorkingDir = fem_prefs.GetString("WorkingDir", "") + + obj.addProperty("App::PropertyEnumeration", "AnalysisType", "Fem", "Type of the analysis") + obj.AnalysisType = FemTools.known_analysis_types + analysis_type = fem_prefs.GetInt("AnalysisType", 0) + obj.AnalysisType = FemTools.known_analysis_types[analysis_type] + + obj.addProperty("App::PropertyIntegerConstraint", "NumberOfEigenmodes", "Fem", "Number of modes for frequency calculations") + noe = fem_prefs.GetInt("NumberOfEigenmodes", 10) + obj.NumberOfEigenmodes = (noe, 1, 100, 1) + + obj.addProperty("App::PropertyFloatConstraint", "EigenmodeLowLimit", "Fem", "Low frequency limit for eigenmode calculations") + #Not yet in prefs, so it will always default to 0.0 + ell = fem_prefs.GetFloat("EigenmodeLowLimit", 0.0) + obj.EigenmodeLowLimit = (ell, 0.0, 1000000.0, 10000.0) + + obj.addProperty("App::PropertyFloatConstraint", "EigenmodeHighLimit", "Fem", "High frequency limit for eigenmode calculations") + ehl = fem_prefs.GetFloat("EigenmodeHighLimit", 1000000.0) + obj.EigenmodeHighLimit = (ehl, 0.0, 1000000.0, 10000.0) + + def execute(self, obj): + return + + def __getstate__(self): + return self.Type + + def __setstate__(self, state): + if state: + self.Type = state diff --git a/src/Mod/Fem/_TaskPanelJobControl.py b/src/Mod/Fem/_TaskPanelJobControl.py index 856650183..47aeded26 100644 --- a/src/Mod/Fem/_TaskPanelJobControl.py +++ b/src/Mod/Fem/_TaskPanelJobControl.py @@ -39,7 +39,7 @@ if FreeCAD.GuiUp: class _TaskPanelJobControl: - def __init__(self, analysis_object): + def __init__(self, solver_object): self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/TaskPanelMechanicalAnalysis.ui") self.fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem") ccx_binary = self.fem_prefs.GetString("ccxBinaryPath", "") @@ -56,7 +56,7 @@ class _TaskPanelJobControl: self.CalculixBinary = 'ccx' self.fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem") - self.analysis_object = analysis_object + self.solver_object = solver_object self.Calculix = QtCore.QProcess() self.Timer = QtCore.QTimer() @@ -159,28 +159,28 @@ class _TaskPanelJobControl: def update(self): 'fills the widgets' - self.form.le_working_dir.setText(self.analysis_object.WorkingDir) - if self.analysis_object.AnalysisType == 'static': + self.form.le_working_dir.setText(self.solver_object.WorkingDir) + if self.solver_object.AnalysisType == 'static': self.form.rb_static_analysis.setChecked(True) - elif self.analysis_object.AnalysisType == 'frequency': + elif self.solver_object.AnalysisType == 'frequency': self.form.rb_frequency_analysis.setChecked(True) return def accept(self): - FreeCADGui.Control.closeDialog() + FreeCADGui.ActiveDocument.resetEdit() def reject(self): - FreeCADGui.Control.closeDialog() + FreeCADGui.ActiveDocument.resetEdit() def choose_working_dir(self): current_wd = self.setup_working_dir() wd = QtGui.QFileDialog.getExistingDirectory(None, 'Choose CalculiX working directory', current_wd) if wd: - self.analysis_object.WorkingDir = wd + self.solver_object.WorkingDir = wd else: - self.analysis_object.WorkingDir = current_wd - self.form.le_working_dir.setText(self.analysis_object.WorkingDir) + self.solver_object.WorkingDir = current_wd + self.form.le_working_dir.setText(self.solver_object.WorkingDir) def write_input_file_handler(self): QApplication.restoreOverrideCursor() @@ -188,7 +188,7 @@ class _TaskPanelJobControl: QApplication.setOverrideCursor(Qt.WaitCursor) self.inp_file_name = "" fea = FemTools() - fea.set_analysis_type(self.analysis_object.AnalysisType) + fea.set_analysis_type(self.solver_object.AnalysisType) fea.update_objects() fea.write_inp_file() if fea.inp_file_name != "": @@ -250,8 +250,8 @@ class _TaskPanelJobControl: QApplication.restoreOverrideCursor() def select_analysis_type(self, analysis_type): - if self.analysis_object.AnalysisType != analysis_type: - self.analysis_object.AnalysisType = analysis_type + if self.solver_object.AnalysisType != analysis_type: + self.solver_object.AnalysisType = analysis_type self.form.pb_edit_inp.setEnabled(False) self.form.pb_run_ccx.setEnabled(False) @@ -263,7 +263,7 @@ class _TaskPanelJobControl: # That function overlaps with FemTools setup_working_dir and needs to be removed when we migrate fully to FemTools def setup_working_dir(self): - wd = self.analysis_object.WorkingDir + wd = self.solver_object.WorkingDir if not (os.path.isdir(wd)): try: os.makedirs(wd) diff --git a/src/Mod/Fem/_ViewProviderFemAnalysis.py b/src/Mod/Fem/_ViewProviderFemAnalysis.py index 26ffb6ab7..70be9f9a7 100644 --- a/src/Mod/Fem/_ViewProviderFemAnalysis.py +++ b/src/Mod/Fem/_ViewProviderFemAnalysis.py @@ -32,10 +32,6 @@ class _ViewProviderFemAnalysis: FreeCADGui.activateWorkbench("FemWorkbench") FemGui.setActiveAnalysis(self.Object) return True - else: - import _TaskPanelJobControl - taskd = _TaskPanelJobControl(self.Object) - FreeCADGui.Control.showDialog(taskd) return True def __getstate__(self): diff --git a/src/Mod/Fem/_ViewProviderFemSolverCalculix.py b/src/Mod/Fem/_ViewProviderFemSolverCalculix.py new file mode 100644 index 000000000..00f1f83bc --- /dev/null +++ b/src/Mod/Fem/_ViewProviderFemSolverCalculix.py @@ -0,0 +1,83 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2015 - Bernd Hahnebach * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program 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 program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "_FemViewProviderSolverCalculix" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + + +import FreeCAD +import FreeCADGui +import FemGui + + +class _ViewProviderFemSolverCalculix: + "A View Provider for the FemSolverCalculix object" + def __init__(self, vobj): + vobj.Proxy = self + + def getIcon(self): + return ":/icons/fem-solver.svg" + + def attach(self, vobj): + self.ViewObject = vobj + self.Object = vobj.Object + + def updateData(self, obj, prop): + return + + def onChanged(self, vobj, prop): + return + + def setEdit(self, vobj, mode=0): + import _TaskPanelJobControl + taskd = _TaskPanelJobControl._TaskPanelJobControl(self.Object) + FreeCADGui.Control.showDialog(taskd) + return True + + def unsetEdit(self, vobj, mode=0): + FreeCADGui.Control.closeDialog() + return + + def doubleClicked(self, vobj): + doc = FreeCADGui.getDocument(vobj.Object.Document) + if not doc.getInEdit(): + # may be go the other way around and just activate the analysis the user has doubleClicked on ?! + if FemGui.getActiveAnalysis() is not None: + if FemGui.getActiveAnalysis().Document is FreeCAD.ActiveDocument: + if self.Object in FemGui.getActiveAnalysis().Member: + doc.setEdit(vobj.Object.Name) + else: + FreeCAD.Console.PrintError('Activate the analysis this solver belongs to!\n') + else: + FreeCAD.Console.PrintError('Active Analysis is not in active Document!\n') + else: + FreeCAD.Console.PrintError('No active Analysis found!\n') + else: + FreeCAD.Console.PrintError('Active Task Dialog found! Please close this one first!\n') + return True + + def __getstate__(self): + return None + + def __setstate__(self, state): + return None