From 61fb3d429ad5fcb419842636cf5149deb3af1749 Mon Sep 17 00:00:00 2001 From: qingfengxia Date: Sun, 8 Jan 2017 21:46:27 +0000 Subject: [PATCH 1/3] Fem: add _CommandMaterialFluid.py and FemMaterial.makeFluidMaterial method --- src/Mod/Fem/App/CMakeLists.txt | 3 +- src/Mod/Fem/CMakeLists.txt | 3 +- src/Mod/Fem/FemMaterial.py | 18 +- src/Mod/Fem/Gui/Workbench.cpp | 6 +- src/Mod/Fem/InitGui.py | 3 +- src/Mod/Fem/TaskPanelFemMaterial.ui | 181 ++++++++++++++++-- ...ndMaterial.py => _CommandMaterialFluid.py} | 18 +- src/Mod/Fem/_CommandMaterialSolid.py | 58 ++++++ src/Mod/Fem/_FemMaterial.py | 2 + 9 files changed, 264 insertions(+), 28 deletions(-) mode change 100644 => 100755 src/Mod/Fem/TaskPanelFemMaterial.ui rename src/Mod/Fem/{_CommandMaterial.py => _CommandMaterialFluid.py} (84%) create mode 100644 src/Mod/Fem/_CommandMaterialSolid.py diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 551d956c2..4f22594a6 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -68,7 +68,8 @@ SET(FemScripts_SRCS _CommandConstraintSelfWeight.py _CommandFEMMesh2Mesh.py _CommandMaterialMechanicalNonlinear.py - _CommandMaterial.py + _CommandMaterialSolid.py + _CommandMaterialFluid.py _CommandMeshGmshFromShape.py _CommandMeshNetgenFromShape.py _CommandMeshGroup.py diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 308e3d580..3aa85c505 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -91,7 +91,8 @@ INSTALL( FemMaterial.py _FemMaterial.py _ViewProviderFemMaterial.py - _CommandMaterial.py + _CommandMaterialSolid.py + _CommandMaterialFluid.py _TaskPanelFemMaterial.py TaskPanelFemMaterial.ui diff --git a/src/Mod/Fem/FemMaterial.py b/src/Mod/Fem/FemMaterial.py index de91e2965..422086f5c 100644 --- a/src/Mod/Fem/FemMaterial.py +++ b/src/Mod/Fem/FemMaterial.py @@ -31,11 +31,25 @@ import FreeCAD import _FemMaterial -def makeFemMaterial(name): - '''makeFemMaterial(name): makes an FEM Material +def makeSolidMaterial(name): + '''makeSolidMaterial(name): makes an FEM Material for solid ''' obj = FreeCAD.ActiveDocument.addObject("App::MaterialObjectPython", name) _FemMaterial._FemMaterial(obj) + obj.Category = 'Solid' + if FreeCAD.GuiUp: + import _ViewProviderFemMaterial + _ViewProviderFemMaterial._ViewProviderFemMaterial(obj.ViewObject) + # FreeCAD.ActiveDocument.recompute() + return obj + + +def makeFluidMaterial(name): + '''makeFluidMaterial(name): makes an FEM Material for fluid + ''' + obj = FreeCAD.ActiveDocument.addObject("App::MaterialObjectPython", name) + _FemMaterial._FemMaterial(obj) + obj.Category = 'Fluid' if FreeCAD.GuiUp: import _ViewProviderFemMaterial _ViewProviderFemMaterial._ViewProviderFemMaterial(obj.ViewObject) diff --git a/src/Mod/Fem/Gui/Workbench.cpp b/src/Mod/Fem/Gui/Workbench.cpp index 7f586c73b..ecc672164 100755 --- a/src/Mod/Fem/Gui/Workbench.cpp +++ b/src/Mod/Fem/Gui/Workbench.cpp @@ -74,7 +74,8 @@ Gui::ToolBarItem* Workbench::setupToolBars() const << "Fem_MeshGroup" //<< "Fem_CreateNodesSet" << "Separator" - << "Fem_Material" + << "Fem_MaterialSolid" + << "Fem_MaterialFluid" << "Fem_MaterialMechanicalNonlinear" << "Fem_BeamSection" << "Fem_ShellThickness" @@ -147,7 +148,8 @@ Gui::MenuItem* Workbench::setupMenuBar() const << "Fem_MeshGroup" << "Fem_CreateNodesSet" << "Separator" - << "Fem_Material" + << "Fem_MaterialSolid" + << "Fem_MaterialFluid" << "Fem_MaterialMechanicalNonlinear" << "Fem_BeamSection" << "Fem_ShellThickness" diff --git a/src/Mod/Fem/InitGui.py b/src/Mod/Fem/InitGui.py index c9832faa7..9bd4f84d3 100644 --- a/src/Mod/Fem/InitGui.py +++ b/src/Mod/Fem/InitGui.py @@ -59,7 +59,8 @@ class FemWorkbench (Workbench): import _CommandAnalysis import _CommandShellThickness import _CommandBeamSection - import _CommandMaterial + import _CommandMaterialSolid + import _CommandMaterialFluid import _CommandMaterialMechanicalNonlinear import _CommandSolverCalculix import _CommandSolverZ88 diff --git a/src/Mod/Fem/TaskPanelFemMaterial.ui b/src/Mod/Fem/TaskPanelFemMaterial.ui old mode 100644 new mode 100755 index 9c468f3a1..f680a5eb0 --- a/src/Mod/Fem/TaskPanelFemMaterial.ui +++ b/src/Mod/Fem/TaskPanelFemMaterial.ui @@ -6,8 +6,8 @@ 0 0 - 370 - 700 + 396 + 790 @@ -26,6 +26,31 @@ Material + + + + + + Fluid + + + + + + + Solid + + + + + + + Category + + + + + @@ -86,7 +111,7 @@ - Solid + Body (3D) @@ -102,6 +127,116 @@ + + + + + 16777215 + 1677215 + + + + Basic Properties + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + Name: + + + + + + + + 0 + 0 + + + + + 80 + 20 + + + + steel + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 2.000000000000000 + + + 2000000000.000000000000000 + + + Pa + + + 3 + + + 0.000000000000000 + + + + + + + + 0 + 0 + + + + + 80 + 20 + + + + 8000 kg/m^3 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 2.000000000000000 + + + 2000000000.000000000000000 + + + kg/m^3 + + + 3 + + + 0.000000000000000 + + + + + + + Density + + + + + + + + @@ -111,7 +246,7 @@ - Material Properties + Mechanical Properties @@ -201,15 +336,37 @@ - - + + + + + + + + + + 16777215 + 1677215 + + + + Fluidic Properties + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + - Density + Kinetic viscosity: - - + + 0 @@ -223,7 +380,7 @@ - 8000 kg/m^3 + 0.000001 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -235,7 +392,7 @@ 2000000000.000000000000000 - kg/m^3 + Pa 3 @@ -259,7 +416,7 @@ - Temperature-Dependant Material Properties + Thermal Properties diff --git a/src/Mod/Fem/_CommandMaterial.py b/src/Mod/Fem/_CommandMaterialFluid.py similarity index 84% rename from src/Mod/Fem/_CommandMaterial.py rename to src/Mod/Fem/_CommandMaterialFluid.py index 840f6718c..92927ef2b 100644 --- a/src/Mod/Fem/_CommandMaterial.py +++ b/src/Mod/Fem/_CommandMaterialFluid.py @@ -20,7 +20,7 @@ # * * # *************************************************************************** -__title__ = "_CommandMaterial" +__title__ = "_CommandFluidMaterial" __author__ = "Juergen Riegel, Bernd Hahnebach" __url__ = "http://www.freecadweb.org" @@ -34,25 +34,25 @@ import FemGui from PySide import QtCore -class _CommandMaterial(FemCommands): - "the Fem_Material command definition" +class _CommandMaterialFluid(FemCommands): + "the Fem_MaterialFluid command definition" def __init__(self): - super(_CommandMaterial, self).__init__() + super(_CommandMaterialFluid, self).__init__() self.resources = {'Pixmap': 'fem-material', - 'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_Material", "FEM material"), + 'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_MaterialFluid", "FEM material for Fluid"), 'Accel': "M, M", - 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_Material", "Creates a FEM material")} + 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_MaterialFluid", "Creates a FEM material for Fluid")} self.is_active = 'with_analysis' def Activated(self): femDoc = FemGui.getActiveAnalysis().Document if FreeCAD.ActiveDocument is not femDoc: FreeCADGui.setActiveDocument(femDoc) - FreeCAD.ActiveDocument.openTransaction("Create Material") + FreeCAD.ActiveDocument.openTransaction("Create Fluid Material") FreeCADGui.addModule("FemMaterial") - FreeCADGui.doCommand("FemMaterial.makeFemMaterial('FemMaterial')") + FreeCADGui.doCommand("FemMaterial.makeFluidMaterial('FluidMaterial')") FreeCADGui.doCommand("App.activeDocument()." + FemGui.getActiveAnalysis().Name + ".Member = App.activeDocument()." + FemGui.getActiveAnalysis().Name + ".Member + [App.ActiveDocument.ActiveObject]") FreeCADGui.doCommand("Gui.activeDocument().setEdit(App.ActiveDocument.ActiveObject.Name)") -FreeCADGui.addCommand('Fem_Material', _CommandMaterial()) +FreeCADGui.addCommand('Fem_MaterialFluid', _CommandMaterialFluid()) diff --git a/src/Mod/Fem/_CommandMaterialSolid.py b/src/Mod/Fem/_CommandMaterialSolid.py new file mode 100644 index 000000000..d32628f52 --- /dev/null +++ b/src/Mod/Fem/_CommandMaterialSolid.py @@ -0,0 +1,58 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2013 - Juergen Riegel * +# * * +# * 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__ = "_CommandSolidMaterial" +__author__ = "Juergen Riegel, Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## @package CommandMaterial +# \ingroup FEM + +import FreeCAD +from FemCommands import FemCommands +import FreeCADGui +import FemGui +from PySide import QtCore + + +class _CommandMaterialSolid(FemCommands): + "the Fem_MaterialSolid command definition" + def __init__(self): + super(_CommandMaterialSolid, self).__init__() + self.resources = {'Pixmap': 'fem-material', + 'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_MaterialSolid", "FEM material for solid"), + 'Accel': "M, M", + 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_MaterialSolid", "Creates a FEM material for solid")} + self.is_active = 'with_analysis' + + def Activated(self): + femDoc = FemGui.getActiveAnalysis().Document + if FreeCAD.ActiveDocument is not femDoc: + FreeCADGui.setActiveDocument(femDoc) + FreeCAD.ActiveDocument.openTransaction("Create Solid Material") + FreeCADGui.addModule("FemMaterial") + FreeCADGui.doCommand("FemMaterial.makeSolidMaterial('SolidMaterial')") + FreeCADGui.doCommand("App.activeDocument()." + FemGui.getActiveAnalysis().Name + ".Member = App.activeDocument()." + FemGui.getActiveAnalysis().Name + ".Member + [App.ActiveDocument.ActiveObject]") + FreeCADGui.doCommand("Gui.activeDocument().setEdit(App.ActiveDocument.ActiveObject.Name)") + + +FreeCADGui.addCommand('Fem_MaterialSolid', _CommandMaterialSolid()) diff --git a/src/Mod/Fem/_FemMaterial.py b/src/Mod/Fem/_FemMaterial.py index 9dd0ab4bc..5ed2eb80a 100644 --- a/src/Mod/Fem/_FemMaterial.py +++ b/src/Mod/Fem/_FemMaterial.py @@ -32,6 +32,8 @@ class _FemMaterial: "The FEM Material object" def __init__(self, obj): obj.addProperty("App::PropertyLinkSubList", "References", "Material", "List of material shapes") + obj.addProperty("App::PropertyEnum", "Category", "Material", "Material type: fluid or solid") + obj.Category = ['Solid', 'Fluid'] obj.Proxy = self self.Type = "FemMaterial" From a378a16b270e96887ba6688d00e0c4bd5de6fa57 Mon Sep 17 00:00:00 2001 From: qingfengxia Date: Wed, 18 Jan 2017 23:32:40 +0000 Subject: [PATCH 2/3] Fem: modify taskpanelFemMaterial to support simple Fluid Material --- src/Mod/Fem/FemMaterial.py | 1 + src/Mod/Fem/TaskPanelFemMaterial.ui | 159 ++++++++++++++------------- src/Mod/Fem/_FemMaterial.py | 4 +- src/Mod/Fem/_TaskPanelFemMaterial.py | 156 +++++++++++++++++++++----- 4 files changed, 210 insertions(+), 110 deletions(-) diff --git a/src/Mod/Fem/FemMaterial.py b/src/Mod/Fem/FemMaterial.py index 422086f5c..3d84440e8 100644 --- a/src/Mod/Fem/FemMaterial.py +++ b/src/Mod/Fem/FemMaterial.py @@ -56,4 +56,5 @@ def makeFluidMaterial(name): # FreeCAD.ActiveDocument.recompute() return obj +makeFemMaterial = makeSolidMaterial # alias to be compatible for FemTest.py # @} diff --git a/src/Mod/Fem/TaskPanelFemMaterial.ui b/src/Mod/Fem/TaskPanelFemMaterial.ui index f680a5eb0..516c5362c 100755 --- a/src/Mod/Fem/TaskPanelFemMaterial.ui +++ b/src/Mod/Fem/TaskPanelFemMaterial.ui @@ -7,7 +7,7 @@ 0 0 396 - 790 + 834 @@ -15,7 +15,7 @@ - + 16777215 @@ -28,21 +28,14 @@ - - + + - Fluid + - - - - Solid - - - - + Category @@ -74,7 +67,7 @@ - + References @@ -128,7 +121,7 @@ - + 16777215 @@ -144,51 +137,24 @@ QFormLayout::AllNonFixedFieldsGrow - - + + - Name: + Density - - - - - 0 - 0 - - - - - 80 - 20 - - + + - steel - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - 2.000000000000000 - - - 2000000000.000000000000000 - - - Pa - - - 3 - - - 0.000000000000000 + save as name - + + + + @@ -225,20 +191,13 @@ - - - - Density - - - - + 16777215 @@ -342,7 +301,7 @@ - + 16777215 @@ -361,12 +320,12 @@ - Kinetic viscosity: + Kinematic viscosity: - + 0 @@ -380,22 +339,22 @@ - 0.000001 + 0.000001 m^2/s Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - 2.000000000000000 + 0.000001000000000 - 2000000000.000000000000000 + 1000.000000000000000 - Pa + m^2/s - 3 + 6 0.000000000000000 @@ -408,7 +367,7 @@ - + 16777215 @@ -431,8 +390,45 @@ + + + + + 0 + 0 + + + + + 80 + 20 + + + + 50 W/m/K + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 2.000000000000000 + + + 2000000000.000000000000000 + + + W/m/K + + + 3 + + + 0.000000000000000 + + + - + Expansion Coefficient: @@ -519,8 +515,15 @@ - - + + + + Vol Expansion Coeff + + + + + 0 @@ -534,22 +537,22 @@ - 50 W/m/K + 0.001 m/m/K Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - 2.000000000000000 + 0.001000000000000 - 2000000000.000000000000000 + 1.000000000000000 - W/m/K + m/m/K - 3 + 6 0.000000000000000 @@ -562,7 +565,7 @@ - + 16777215 diff --git a/src/Mod/Fem/_FemMaterial.py b/src/Mod/Fem/_FemMaterial.py index 5ed2eb80a..3e97f2a77 100644 --- a/src/Mod/Fem/_FemMaterial.py +++ b/src/Mod/Fem/_FemMaterial.py @@ -32,8 +32,8 @@ class _FemMaterial: "The FEM Material object" def __init__(self, obj): obj.addProperty("App::PropertyLinkSubList", "References", "Material", "List of material shapes") - obj.addProperty("App::PropertyEnum", "Category", "Material", "Material type: fluid or solid") - obj.Category = ['Solid', 'Fluid'] + obj.addProperty("App::PropertyEnumeration", "Category", "Material", "Material type: fluid or solid") + obj.Category = ['Solid', 'Fluid'] # used in TaskPanel obj.Proxy = self self.Type = "FemMaterial" diff --git a/src/Mod/Fem/_TaskPanelFemMaterial.py b/src/Mod/Fem/_TaskPanelFemMaterial.py index 0b87cafc8..1af66d48f 100644 --- a/src/Mod/Fem/_TaskPanelFemMaterial.py +++ b/src/Mod/Fem/_TaskPanelFemMaterial.py @@ -21,7 +21,7 @@ # *************************************************************************** __title__ = "_TaskPanelFemMaterial" -__author__ = "Juergen Riegel, Bernd Hahnebach" +__author__ = "Juergen Riegel, Bernd Hahnebach, Qingfeng Xia" __url__ = "http://www.freecadweb.org" ## @package TaskPanelFemMaterial @@ -52,16 +52,34 @@ class _TaskPanelFemMaterial: self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/TaskPanelFemMaterial.ui") QtCore.QObject.connect(self.form.pushButton_MatWeb, QtCore.SIGNAL("clicked()"), self.goMatWeb) + QtCore.QObject.connect(self.form.pushButton_saveas, QtCore.SIGNAL("clicked()"), self.saveas_material) QtCore.QObject.connect(self.form.cb_materials, QtCore.SIGNAL("activated(int)"), self.choose_material) - QtCore.QObject.connect(self.form.input_fd_young_modulus, QtCore.SIGNAL("valueChanged(double)"), self.ym_changed) - QtCore.QObject.connect(self.form.spinBox_poisson_ratio, QtCore.SIGNAL("valueChanged(double)"), self.pr_changed) - QtCore.QObject.connect(self.form.input_fd_density, QtCore.SIGNAL("valueChanged(double)"), self.density_changed) QtCore.QObject.connect(self.form.pushButton_Reference, QtCore.SIGNAL("clicked()"), self.add_references) QtCore.QObject.connect(self.form.rb_standard, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_standard) QtCore.QObject.connect(self.form.rb_solid, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_solid) + # basic properties must be provided + QtCore.QObject.connect(self.form.input_fd_density, QtCore.SIGNAL("valueChanged(double)"), self.density_changed) + # mechanical properties + QtCore.QObject.connect(self.form.input_fd_young_modulus, QtCore.SIGNAL("valueChanged(double)"), self.ym_changed) + QtCore.QObject.connect(self.form.spinBox_poisson_ratio, QtCore.SIGNAL("valueChanged(double)"), self.pr_changed) + # thermal properties QtCore.QObject.connect(self.form.input_fd_thermal_conductivity, QtCore.SIGNAL("valueChanged(double)"), self.tc_changed) QtCore.QObject.connect(self.form.input_fd_expansion_coefficient, QtCore.SIGNAL("valueChanged(double)"), self.tec_changed) QtCore.QObject.connect(self.form.input_fd_specific_heat, QtCore.SIGNAL("valueChanged(double)"), self.sh_changed) + # fluidic properties, only volumetric thermal expansion coeff makes sense + QtCore.QObject.connect(self.form.input_fd_kinematic_viscosity, QtCore.SIGNAL("valueChanged(double)"), self.kinematic_viscosity_changed) + QtCore.QObject.connect(self.form.input_fd_vol_expansion_coefficient, QtCore.SIGNAL("valueChanged(double)"), self.vtec_changed) + + # hide some groupBox according to material category + self.form.label_category.setText(self.obj.Category) + if self.obj.Category == 'Fluid': + self.form.groupBox_mechanical.setVisible(0) + self.form.label_expansion_coefficient.setVisible(0) + self.form.input_fd_expansion_coefficient.setVisible(0) + else: + self.form.groupBox_fluidic.setVisible(0) + self.form.label_vol_expansion_coefficient.setVisible(0) + self.form.input_fd_vol_expansion_coefficient.setVisible(0) self.form.list_References.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.form.list_References.connect(self.form.list_References, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.references_list_right_clicked) @@ -141,15 +159,26 @@ class _TaskPanelFemMaterial: webbrowser.open("http://matweb.com") def check_material_keys(self): - if 'YoungsModulus' not in self.material: - print('YoungsModulus not found in material data of: ' + self.material['Name']) - self.material['YoungsModulus'] = '0 MPa' if 'Density' not in self.material: print('Density not found in material data of: ' + self.material['Name']) self.material['Density'] = '0 kg/m^3' - if 'PoissonRatio' not in self.material: - print('PoissonRatio not found in material data of: ' + self.material['Name']) - self.material['PoissonRatio'] = '0' + if self.obj.Category == 'Solid': + # mechanical properties + if 'YoungsModulus' not in self.material: + print('YoungsModulus not found in material data of: ' + self.material['Name']) + self.material['YoungsModulus'] = '0 MPa' + if 'PoissonRatio' not in self.material: + print('PoissonRatio not found in material data of: ' + self.material['Name']) + self.material['PoissonRatio'] = '0' + if self.obj.Category == 'Fluid': + # Fluidic properties + if 'KinematicViscosity' not in self.material: + print('KinematicViscosity not found in material data of: ' + self.material['Name']) + self.material['KineticViscosity'] = '0 m^2/s' + if 'VolumetricThermalExpansionCoefficient' not in self.material: + print('VolumetricThermalExpansionCoefficient not found in material data of: ' + self.material['Name']) + self.material['VolumetricThermalExpansionCoefficient'] = '0 m/m/K' + # Thermal properties if 'ThermalConductivity' not in self.material: print('ThermalConductivity not found in material data of: ' + self.material['Name']) self.material['ThermalConductivity'] = '0 W/m/K' @@ -159,6 +188,7 @@ class _TaskPanelFemMaterial: if 'SpecificHeat' not in self.material: print('SpecificHeat not found in material data of: ' + self.material['Name']) self.material['SpecificHeat'] = '0 J/kg/K' + # Electromagnetic properties def ym_changed(self, value): # FreeCADs standard unit for stress is kPa @@ -226,6 +256,29 @@ class _TaskPanelFemMaterial: material['SpecificHeat'] = unicode(value_in_J_per_kgK) + " J/kg/K" self.material = material + ################ fluidic ######################### + def vtec_changed(self, value): + old_vtec = Units.Quantity(self.material['VolumetricThermalExpansionCoefficient']).getValueAs("m/m/K") + variation = 0.001 + if value: + if not (1 - variation < float(old_vtec) / value < 1 + variation): + # VolumetricThermalExpansionCoefficient has changed + material = self.material + value_in_one_per_K = value * 1e6 # To compensate for use of SI units + material['VolumetricThermalExpansionCoefficient'] = unicode(value_in_one_per_K) + " m/m/K" + self.material = material + + def kinematic_viscosity_changed(self, value): + old_nu = Units.Quantity(self.material['KinematicViscosity']).getValueAs("m^2/s") + variation = 0.000001 + if value: + if not (1 - variation < float(old_nu) / value < 1 + variation): + # KinematicViscosity has changed + material = self.material + value_in_m2_per_second = value * 1e6 # To compensate for use of SI units + material['KinematicViscosity'] = unicode(value_in_m2_per_second) + " m^2/s" + self.material = material + def choose_material(self, index): if index < 0: return @@ -260,17 +313,31 @@ class _TaskPanelFemMaterial: self.form.input_fd_young_modulus.setText("{} {}".format(ym_with_new_unit, ym_new_unit)) if 'PoissonRatio' in matmap: self.form.spinBox_poisson_ratio.setValue(float(matmap['PoissonRatio'])) + # Fluidic properties + if 'KinematicViscosity' in matmap: + nu_new_unit = "m^2/s" + nu = FreeCAD.Units.Quantity(matmap['KinematicViscosity']) + nu_with_new_unit = nu.getValueAs(nu_new_unit) + self.form.input_fd_kinematic_viscosity.setText("{} {}".format(nu_with_new_unit, nu_new_unit)) + # For isotropic materials the volumetric thermal expansion coefficient is three times the linear coefficient: + if 'VolumetricThermalExpansionCoefficient' in matmap: # linear, only for solid + vtec_new_unit = "m/m/K" + vtec = FreeCAD.Units.Quantity(matmap['VolumetricThermalExpansionCoefficient']) + vtec_with_new_unit = vtec.getValueAs(vtec_new_unit) + self.form.input_fd_vol_expansion_coefficient.setText("{} {}".format(vtec_with_new_unit, vtec_new_unit)) + if 'Density' in matmap: density_new_unit = "kg/m^3" density = FreeCAD.Units.Quantity(matmap['Density']) density_with_new_unit = density.getValueAs(density_new_unit) self.form.input_fd_density.setText("{} {}".format(density_with_new_unit, density_new_unit)) + # thermal properties if 'ThermalConductivity' in matmap: tc_new_unit = "W/m/K" tc = FreeCAD.Units.Quantity(matmap['ThermalConductivity']) tc_with_new_unit = tc.getValueAs(tc_new_unit) self.form.input_fd_thermal_conductivity.setText("{} {}".format(tc_with_new_unit, tc_new_unit)) - if 'ThermalExpansionCoefficient' in matmap: + if 'ThermalExpansionCoefficient' in matmap: # linear, only for solid tec_new_unit = "um/m/K" tec = FreeCAD.Units.Quantity(matmap['ThermalExpansionCoefficient']) tec_with_new_unit = tec.getValueAs(tec_new_unit) @@ -286,6 +353,49 @@ class _TaskPanelFemMaterial: self.form.cb_materials.addItem(QtGui.QIcon(":/icons/help-browser.svg"), material_name, material_name) self.materials[material_name] = material + def import_materials(self): + self.materials = {} + self.pathList = [] + self.form.cb_materials.clear() + + self.fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem/General") + if self.obj.Category == 'Fluid': + self.import_fluid_materials() + else: + self.import_solid_materials() + + def import_solid_materials(self): + use_built_in_materials = self.fem_prefs.GetBool("UseBuiltInMaterials", True) + if use_built_in_materials: + system_mat_dir = FreeCAD.getResourceDir() + "/Mod/Material/StandardMaterial" + self.add_mat_dir(system_mat_dir, ":/icons/freecad.svg") + + use_mat_from_config_dir = self.fem_prefs.GetBool("UseMaterialsFromConfigDir", True) + if use_mat_from_config_dir: + user_mat_dirname = FreeCAD.getUserAppDataDir() + "Materials" + self.add_mat_dir(user_mat_dirname, ":/icons/preferences-general.svg") + + use_mat_from_custom_dir = self.fem_prefs.GetBool("UseMaterialsFromCustomDir", True) + if use_mat_from_custom_dir: + custom_mat_dir = self.fem_prefs.GetString("CustomMaterialsDir", "") + self.add_mat_dir(custom_mat_dir, ":/icons/user.svg") + + def import_fluid_materials(self): + #use_built_in_materials = self.fem_prefs.GetBool("UseBuiltInMaterials", True) + #if use_built_in_materials: + system_mat_dir = FreeCAD.getResourceDir() + "/Mod/Material/FluidMaterial" + self.add_mat_dir(system_mat_dir, ":/icons/freecad.svg") + + use_mat_from_config_dir = self.fem_prefs.GetBool("UseMaterialsFromConfigDir", True) + if use_mat_from_config_dir: + user_mat_dirname = FreeCAD.getUserAppDataDir() + "Materials" + self.add_mat_dir(user_mat_dirname, ":/icons/preferences-general.svg") + + use_mat_from_custom_dir = self.fem_prefs.GetBool("UseMaterialsFromCustomDir", True) + if use_mat_from_custom_dir: + custom_mat_dir = self.fem_prefs.GetString("CustomMaterialsDir", "") + self.add_mat_dir(custom_mat_dir, ":/icons/user.svg") + def add_mat_dir(self, mat_dir, icon): import glob import os @@ -303,26 +413,12 @@ class _TaskPanelFemMaterial: for mat in material_name_list: self.form.cb_materials.addItem(QtGui.QIcon(icon), mat[0], mat[1]) - def import_materials(self): - self.materials = {} - self.pathList = [] - self.form.cb_materials.clear() - self.fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem/General") - use_built_in_materials = self.fem_prefs.GetBool("UseBuiltInMaterials", True) - if use_built_in_materials: - system_mat_dir = FreeCAD.getResourceDir() + "/Mod/Material/StandardMaterial" - self.add_mat_dir(system_mat_dir, ":/icons/freecad.svg") - - use_mat_from_config_dir = self.fem_prefs.GetBool("UseMaterialsFromConfigDir", True) - if use_mat_from_config_dir: - user_mat_dirname = FreeCAD.getUserAppDataDir() + "Materials" - self.add_mat_dir(user_mat_dirname, ":/icons/preferences-general.svg") - - use_mat_from_custom_dir = self.fem_prefs.GetBool("UseMaterialsFromCustomDir", True) - if use_mat_from_custom_dir: - custom_mat_dir = self.fem_prefs.GetString("CustomMaterialsDir", "") - self.add_mat_dir(custom_mat_dir, ":/icons/user.svg") + def saveas_material(self): + import Material + mat_file_extension = ".FCMat" + # overwritinig warning, save to customed dir, material name check + ###################geometry reference selection ################# def references_list_right_clicked(self, QPos): self.form.contextMenu = QtGui.QMenu() menu_item = self.form.contextMenu.addAction("Remove Reference") From 82526160af613bb71bf1909eed7cc59079e8f474 Mon Sep 17 00:00:00 2001 From: qingfengxia Date: Thu, 19 Jan 2017 00:08:02 +0000 Subject: [PATCH 3/3] Fem: add air and water fluid material into data/Mod/Material --- src/Mod/Fem/_TaskPanelFemMaterial.py | 4 ++-- src/Mod/Material/CMakeLists.txt | 17 +++++++++++++++++ src/Mod/Material/FluidMaterial/Air.FCMat | 15 +++++++++++++++ src/Mod/Material/FluidMaterial/None.FCMat | 12 ++++++++++++ src/Mod/Material/FluidMaterial/Readme.txt | 7 +++++++ src/Mod/Material/FluidMaterial/Water.FCMat | 14 ++++++++++++++ 6 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 src/Mod/Material/FluidMaterial/Air.FCMat create mode 100644 src/Mod/Material/FluidMaterial/None.FCMat create mode 100644 src/Mod/Material/FluidMaterial/Readme.txt create mode 100644 src/Mod/Material/FluidMaterial/Water.FCMat diff --git a/src/Mod/Fem/_TaskPanelFemMaterial.py b/src/Mod/Fem/_TaskPanelFemMaterial.py index 1af66d48f..76de8660f 100644 --- a/src/Mod/Fem/_TaskPanelFemMaterial.py +++ b/src/Mod/Fem/_TaskPanelFemMaterial.py @@ -264,7 +264,7 @@ class _TaskPanelFemMaterial: if not (1 - variation < float(old_vtec) / value < 1 + variation): # VolumetricThermalExpansionCoefficient has changed material = self.material - value_in_one_per_K = value * 1e6 # To compensate for use of SI units + value_in_one_per_K = value material['VolumetricThermalExpansionCoefficient'] = unicode(value_in_one_per_K) + " m/m/K" self.material = material @@ -275,7 +275,7 @@ class _TaskPanelFemMaterial: if not (1 - variation < float(old_nu) / value < 1 + variation): # KinematicViscosity has changed material = self.material - value_in_m2_per_second = value * 1e6 # To compensate for use of SI units + value_in_m2_per_second = value material['KinematicViscosity'] = unicode(value_in_m2_per_second) + " m^2/s" self.material = material diff --git a/src/Mod/Material/CMakeLists.txt b/src/Mod/Material/CMakeLists.txt index 6e2610d72..2cdbfd679 100644 --- a/src/Mod/Material/CMakeLists.txt +++ b/src/Mod/Material/CMakeLists.txt @@ -27,6 +27,14 @@ SET (MaterialLib_Files ) SOURCE_GROUP("MatLib" FILES ${MaterialLib_Files}) +SET (FluidMaterial_Files + FluidMaterial/None.FCMat + FluidMaterial/Air.FCMat + FluidMaterial/Water.FCMat + FluidMaterial/Readme.txt +) +SOURCE_GROUP("MatLib" FILES ${FluidMaterial_Files}) + ADD_CUSTOM_TARGET(Material ALL SOURCES ${Material_SRCS} ${Material_QRC_SRCS} ) @@ -46,6 +54,9 @@ ENDIF (BUILD_GUI) ADD_CUSTOM_TARGET(MaterialLib ALL SOURCES ${MaterialLib_Files} ) +ADD_CUSTOM_TARGET(FluidMaterialLib ALL + SOURCES ${FluidMaterial_Files} +) # When a target copies files to different output directories then apparently it always builds the project # which is very annoying. So, the trick is to split this into two targets to avoid this behaviour. @@ -53,6 +64,10 @@ fc_target_copy_resource(MaterialLib ${CMAKE_SOURCE_DIR}/src/Mod/Material ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_DATADIR}/Mod/Material ${MaterialLib_Files}) +fc_target_copy_resource(FluidMaterialLib + ${CMAKE_SOURCE_DIR}/src/Mod/Material + ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_DATADIR}/Mod/Material + ${FluidMaterial_Files}) INSTALL( FILES ${Material_SRCS} ${Material_QRC_SRCS} @@ -62,6 +77,8 @@ INSTALL( INSTALL( DIRECTORY StandardMaterial + DIRECTORY + FluidMaterial DESTINATION ${CMAKE_INSTALL_DATADIR}/Mod/Material FILES_MATCHING PATTERN "*.FCMat*" diff --git a/src/Mod/Material/FluidMaterial/Air.FCMat b/src/Mod/Material/FluidMaterial/Air.FCMat new file mode 100644 index 000000000..13c932cf4 --- /dev/null +++ b/src/Mod/Material/FluidMaterial/Air.FCMat @@ -0,0 +1,15 @@ +[FCMat] +Name = Air +Description = Standard air properties at 20 Degrees Celsius and 1 atm +MolarMass = 28.965 + +Density = 1.20 kg/m^3 +DynamicViscosity = 1.80e-5 kg/m/s +KinematicViscosity = 1.511e-5 m^2/s + +VolumetricThermalExpansionCoefficient = 3.43e-3 m/m/K +PrandtlNumber = 0.7 + +SpecificHeat = 1.005 J/kg/K +ThermalConductivity = 0.0257 W/m/K + diff --git a/src/Mod/Material/FluidMaterial/None.FCMat b/src/Mod/Material/FluidMaterial/None.FCMat new file mode 100644 index 000000000..175136a87 --- /dev/null +++ b/src/Mod/Material/FluidMaterial/None.FCMat @@ -0,0 +1,12 @@ +[FCdMat] +Name = None +Description = None + +Density = 0 kg/m^3 +DynamicViscosity = 0 kg/m/s +KinematicViscosity = 0 m^2/s +VolumetricExpansionCoefficient = 0 m/m/K + +SpecificHeat = 0 J/kg/K +ThermalConductivity = 0 W/m/K +ThermalExpansionCoefficient = 0 um/m/K diff --git a/src/Mod/Material/FluidMaterial/Readme.txt b/src/Mod/Material/FluidMaterial/Readme.txt new file mode 100644 index 000000000..ca7ceaff8 --- /dev/null +++ b/src/Mod/Material/FluidMaterial/Readme.txt @@ -0,0 +1,7 @@ +This is the FreeCAD simple fluid material library +data is taken from matweb +currently only water and air at the standard condition (20C and 1 atm) is prepared for testing + + +CSIR team is working on CfdFluidMaterial in CFD workbench to support more complex fluid material + diff --git a/src/Mod/Material/FluidMaterial/Water.FCMat b/src/Mod/Material/FluidMaterial/Water.FCMat new file mode 100644 index 000000000..141279687 --- /dev/null +++ b/src/Mod/Material/FluidMaterial/Water.FCMat @@ -0,0 +1,14 @@ +[FCdMat] +Name = Water +Description = Standard distilled water properties at 20 Degrees Celsius and 1 atm +MolarMass = 18 + +Density = 998 kg/m^3 +DynamicViscosity = 1.003e-3 kg/m/s +KinematicViscosity = 1.005 m^2/s + +VolumetricExpansionCoefficient = 2.07e-4 m/m/K + +SpecificHeat = 4.182 J/kg/K +ThermalConductivity = 0.591 W/m/K +