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..3d84440e8 100644
--- a/src/Mod/Fem/FemMaterial.py
+++ b/src/Mod/Fem/FemMaterial.py
@@ -31,15 +31,30 @@ 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)
+ # FreeCAD.ActiveDocument.recompute()
+ return obj
+
+makeFemMaterial = makeSolidMaterial # alias to be compatible for FemTest.py
# @}
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..516c5362c
--- a/src/Mod/Fem/TaskPanelFemMaterial.ui
+++ b/src/Mod/Fem/TaskPanelFemMaterial.ui
@@ -6,8 +6,8 @@
0
0
- 370
- 700
+ 396
+ 834
@@ -15,7 +15,7 @@
-
-
+
16777215
@@ -26,6 +26,24 @@
Material
+
-
+
+
-
+
+
+
+
+
+
+ -
+
+
+ Category
+
+
+
+
+
-
-
@@ -49,7 +67,7 @@
-
-
+
References
@@ -86,7 +104,7 @@
-
- Solid
+ Body (3D)
@@ -103,7 +121,7 @@
-
-
+
16777215
@@ -111,7 +129,83 @@
- Material Properties
+ Basic Properties
+
+
+
-
+
+
+ QFormLayout::AllNonFixedFieldsGrow
+
+
-
+
+
+ Density
+
+
+
+ -
+
+
+ save as name
+
+
+
+ -
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 80
+ 20
+
+
+
+ 8000 kg/m^3
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ 2.000000000000000
+
+
+ 2000000000.000000000000000
+
+
+ kg/m^3
+
+
+ 3
+
+
+ 0.000000000000000
+
+
+
+
+
+
+
+
+ -
+
+
+
+ 16777215
+ 1677215
+
+
+
+ Mechanical Properties
-
@@ -201,15 +295,37 @@
- -
-
+
+
+
+
+
+ -
+
+
+
+ 16777215
+ 1677215
+
+
+
+ Fluidic Properties
+
+
+
-
+
+
+ QFormLayout::AllNonFixedFieldsGrow
+
+
-
+
- Density
+ Kinematic viscosity:
- -
-
+
-
+
0
@@ -223,22 +339,22 @@
- 8000 kg/m^3
+ 0.000001 m^2/s
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
- 2.000000000000000
+ 0.000001000000000
- 2000000000.000000000000000
+ 1000.000000000000000
- kg/m^3
+ m^2/s
- 3
+ 6
0.000000000000000
@@ -251,7 +367,7 @@
-
-
+
16777215
@@ -259,7 +375,7 @@
- Temperature-Dependant Material Properties
+ Thermal Properties
-
@@ -274,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:
@@ -362,8 +515,15 @@
- -
-
+
-
+
+
+ Vol Expansion Coeff
+
+
+
+ -
+
0
@@ -377,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
@@ -405,7 +565,7 @@
-
-
+
16777215
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..3e97f2a77 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::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..76de8660f 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
+ 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
+ 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")
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
+