| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| __title__ = "FreeCAD FEM material task panel for the document object" |
| __author__ = "Juergen Riegel, Bernd Hahnebach, Qingfeng Xia" |
| __url__ = "https://www.freecad.org" |
|
|
| |
| |
| |
| |
|
|
| from PySide import QtCore |
|
|
| import FreeCAD |
| import FreeCADGui |
| from FreeCAD import Units |
| import Materials |
| import MatGui |
|
|
| from femguiutils import selection_widgets |
| from . import base_femtaskpanel |
|
|
|
|
| class _TaskPanel(base_femtaskpanel._BaseTaskPanel): |
| """ |
| The editmode TaskPanel for FemMaterial objects |
| """ |
|
|
| def __init__(self, obj): |
| super().__init__(obj) |
|
|
| |
| self.material = self.obj.Material |
| self.uuid = self.obj.UUID |
| self.material_manager = Materials.MaterialManager() |
|
|
| |
| self.parameterWidget = FreeCADGui.PySideUic.loadUi( |
| FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/Material.ui" |
| ) |
| self.material_tree = MatGui.MaterialTreeWidget(self.parameterWidget.wgt_material_tree) |
| self.material_tree.expanded = False |
| self.material_tree.IncludeEmptyFolders = False |
| self.material_tree.IncludeEmptyLibraries = False |
|
|
| QtCore.QObject.connect( |
| self.parameterWidget.chbu_allow_edit, |
| QtCore.SIGNAL("clicked()"), |
| self.toggleInputFieldsReadOnly, |
| ) |
| |
| QtCore.QObject.connect( |
| self.parameterWidget.qsb_density, |
| QtCore.SIGNAL("editingFinished()"), |
| self.density_changed, |
| ) |
| |
| QtCore.QObject.connect( |
| self.parameterWidget.qsb_young_modulus, |
| QtCore.SIGNAL("editingFinished()"), |
| self.ym_changed, |
| ) |
| QtCore.QObject.connect( |
| self.parameterWidget.qsb_poisson_ratio, |
| QtCore.SIGNAL("editingFinished()"), |
| self.pr_changed, |
| ) |
| |
| QtCore.QObject.connect( |
| self.parameterWidget.qsb_thermal_conductivity, |
| QtCore.SIGNAL("editingFinished()"), |
| self.tc_changed, |
| ) |
| QtCore.QObject.connect( |
| self.parameterWidget.qsb_expansion_coefficient, |
| QtCore.SIGNAL("editingFinished()"), |
| self.tec_changed, |
| ) |
| QtCore.QObject.connect( |
| self.parameterWidget.qsb_expansion_reference_temperature, |
| QtCore.SIGNAL("editingFinished()"), |
| self.tec_changed, |
| ) |
| QtCore.QObject.connect( |
| self.parameterWidget.qsb_specific_heat, |
| QtCore.SIGNAL("editingFinished()"), |
| self.sh_changed, |
| ) |
| |
| QtCore.QObject.connect( |
| self.parameterWidget.qsb_kinematic_viscosity, |
| QtCore.SIGNAL("editingFinished()"), |
| self.kinematic_viscosity_changed, |
| ) |
| QtCore.QObject.connect( |
| self.parameterWidget.wgt_material_tree, |
| QtCore.SIGNAL("onMaterial(QString)"), |
| self.set_from_editor, |
| ) |
|
|
| |
| self.parameterWidget.chbu_allow_edit.setCheckState(QtCore.Qt.CheckState.Unchecked) |
| self.toggleInputFieldsReadOnly() |
|
|
| |
| if self.obj.Category == "Fluid": |
| self.filter_models(self.obj.Category) |
| self.parameterWidget.groupBox_mechanical.setVisible(0) |
| else: |
| self.parameterWidget.groupBox_fluidic.setVisible(0) |
|
|
| |
| self.selectionWidget = selection_widgets.GeometryElementsSelection( |
| obj.References, ["Solid", "Face", "Edge"], False, True |
| ) |
|
|
| |
| self.form = [self.parameterWidget, self.selectionWidget] |
|
|
| |
| self.material_tree.UUID = self.uuid |
| self.set_mat_params_in_input_fields(self.material) |
|
|
| self.selectionWidget.has_equal_references_shape_types() |
|
|
| |
| def accept(self): |
| if self.selectionWidget.has_equal_references_shape_types(): |
| self.obj.Material = self.material |
| self.obj.UUID = self.uuid |
| self.obj.References = self.selectionWidget.references |
|
|
| self.selectionWidget.finish_selection() |
| return super().accept() |
|
|
| def reject(self): |
| self.selectionWidget.finish_selection() |
| return super().reject() |
|
|
| |
| def filter_models(self, category): |
| material_filter = Materials.MaterialFilter() |
| models = set(Materials.ModelManager().Models.keys()) |
| uuids = Materials.UUIDs() |
| if category == "Fluid": |
| material_filter.RequiredModels = [uuids.Fluid] |
| self.material_tree.setFilter(material_filter) |
|
|
| def toggleInputFieldsReadOnly(self): |
| if self.parameterWidget.chbu_allow_edit.isChecked(): |
| self.parameterWidget.qsb_density.setDisabled(False) |
| self.parameterWidget.qsb_young_modulus.setDisabled(False) |
| self.parameterWidget.qsb_poisson_ratio.setDisabled(False) |
| self.parameterWidget.qsb_thermal_conductivity.setDisabled(False) |
| self.parameterWidget.qsb_expansion_coefficient.setDisabled(False) |
| self.parameterWidget.qsb_expansion_reference_temperature.setDisabled(False) |
| self.parameterWidget.qsb_specific_heat.setDisabled(False) |
| self.parameterWidget.qsb_kinematic_viscosity.setDisabled(False) |
| self.parameterWidget.wgt_material_tree.setEnabled(False) |
| self.uuid = "" |
| self.mat_from_input_fields() |
| else: |
| self.parameterWidget.qsb_density.setDisabled(True) |
| self.parameterWidget.qsb_young_modulus.setDisabled(True) |
| self.parameterWidget.qsb_poisson_ratio.setDisabled(True) |
| self.parameterWidget.qsb_thermal_conductivity.setDisabled(True) |
| self.parameterWidget.qsb_expansion_coefficient.setDisabled(True) |
| self.parameterWidget.qsb_expansion_reference_temperature.setDisabled(True) |
| self.parameterWidget.qsb_specific_heat.setDisabled(True) |
| self.parameterWidget.qsb_kinematic_viscosity.setDisabled(True) |
| self.parameterWidget.wgt_material_tree.setEnabled(True) |
| self.set_from_editor(self.material_tree.UUID) |
|
|
| |
| |
| def ym_changed(self): |
| if self.parameterWidget.chbu_allow_edit.isChecked(): |
| self.material["YoungsModulus"] = self.parameterWidget.qsb_young_modulus.property( |
| "value" |
| ).UserString |
|
|
| def density_changed(self): |
| if self.parameterWidget.chbu_allow_edit.isChecked(): |
| self.material["Density"] = self.parameterWidget.qsb_density.property("value").UserString |
|
|
| def pr_changed(self): |
| if self.parameterWidget.chbu_allow_edit.isChecked(): |
| self.material["PoissonRatio"] = str( |
| self.parameterWidget.qsb_poisson_ratio.property("value").Value |
| ) |
|
|
| |
| def tc_changed(self): |
| if self.parameterWidget.chbu_allow_edit.isChecked(): |
| self.material["ThermalConductivity"] = ( |
| self.parameterWidget.qsb_thermal_conductivity.property("value").UserString |
| ) |
|
|
| def tec_changed(self): |
| if self.parameterWidget.chbu_allow_edit.isChecked(): |
| self.material["ThermalExpansionCoefficient"] = ( |
| self.parameterWidget.qsb_expansion_coefficient.property("value").UserString |
| ) |
|
|
| def tec_changed(self): |
| if self.parameterWidget.chbu_allow_edit.isChecked(): |
| self.material["ThermalExpansionReferenceTemperature"] = ( |
| self.parameterWidget.qsb_expansion_reference_temperature.property( |
| "value" |
| ).UserString |
| ) |
|
|
| def sh_changed(self): |
| if self.parameterWidget.chbu_allow_edit.isChecked(): |
| self.material["SpecificHeat"] = self.parameterWidget.qsb_specific_heat.property( |
| "value" |
| ).UserString |
|
|
| |
| def kinematic_viscosity_changed(self): |
| if self.parameterWidget.chbu_allow_edit.isChecked(): |
| self.material["KinematicViscosity"] = ( |
| self.parameterWidget.qsb_kinematic_viscosity.property("value").UserString |
| ) |
|
|
| def set_mat_params_in_input_fields(self, matmap): |
| if "YoungsModulus" in matmap: |
| self.parameterWidget.qsb_young_modulus.setProperty( |
| "value", Units.Quantity(matmap["YoungsModulus"]) |
| ) |
| else: |
| self.parameterWidget.qsb_young_modulus.setProperty("rawValue", 0.0) |
|
|
| if "PoissonRatio" in matmap: |
| self.parameterWidget.qsb_poisson_ratio.setProperty( |
| "value", Units.Quantity(matmap["PoissonRatio"]) |
| ) |
| else: |
| self.parameterWidget.qsb_poisson_ratio.setProperty("rawValue", 0.0) |
| |
| if "KinematicViscosity" in matmap: |
| self.parameterWidget.qsb_kinematic_viscosity.setProperty( |
| "value", Units.Quantity(matmap["KinematicViscosity"]) |
| ) |
| else: |
| self.parameterWidget.qsb_kinematic_viscosity.setProperty("rawValue", 0.0) |
|
|
| if "Density" in matmap: |
| self.parameterWidget.qsb_density.setProperty("value", Units.Quantity(matmap["Density"])) |
| else: |
| self.parameterWidget.qsb_density.setProperty("rawValue", 0.0) |
| |
| if "ThermalConductivity" in matmap: |
| self.parameterWidget.qsb_thermal_conductivity.setProperty( |
| "value", Units.Quantity(matmap["ThermalConductivity"]) |
| ) |
| else: |
| self.parameterWidget.qsb_thermal_conductivity.setProperty("rawValue", 0.0) |
|
|
| if "ThermalExpansionCoefficient" in matmap: |
| v = Units.Quantity(matmap["ThermalExpansionCoefficient"]) |
| v.Format = {"Precision": 3} |
| self.parameterWidget.qsb_expansion_coefficient.setProperty("value", v) |
| else: |
| self.parameterWidget.qsb_expansion_coefficient.setProperty("rawValue", 0.0) |
| if "ThermalExpansionReferenceTemperature" in matmap: |
| self.parameterWidget.qsb_expansion_reference_temperature.setProperty( |
| "value", Units.Quantity(matmap["ThermalExpansionReferenceTemperature"]) |
| ) |
| else: |
| self.parameterWidget.qsb_expansion_reference_temperature.setProperty("rawValue", 0.0) |
| if "SpecificHeat" in matmap: |
| self.parameterWidget.qsb_specific_heat.setProperty( |
| "value", Units.Quantity(matmap["SpecificHeat"]) |
| ) |
| else: |
| self.parameterWidget.qsb_specific_heat.setProperty("rawValue", 0.0) |
|
|
| def set_from_editor(self, value): |
| if not value: |
| return |
| mat = self.material_manager.getMaterial(value) |
| self.material = mat.Properties |
| self.uuid = mat.UUID |
| self.set_mat_params_in_input_fields(self.material) |
|
|
| def mat_from_input_fields(self): |
| d = {} |
| d["Name"] = "Custom" |
| p = self.parameterWidget |
| d["Density"] = p.qsb_density.property("value").UserString |
| d["ThermalConductivity"] = p.qsb_thermal_conductivity.property("value").UserString |
| d["ThermalExpansionCoefficient"] = p.qsb_expansion_coefficient.property("value").UserString |
| d["ThermalExpansionReferenceTemperature"] = p.qsb_expansion_reference_temperature.property( |
| "value" |
| ).UserString |
| d["SpecificHeat"] = p.qsb_specific_heat.property("value").UserString |
| if self.obj.Category == "Solid": |
| d["YoungsModulus"] = p.qsb_young_modulus.property("value").UserString |
| d["PoissonRatio"] = str(p.qsb_poisson_ratio.property("value").Value) |
| elif self.obj.Category == "Fluid": |
| d["KinematicViscosity"] = p.qsb_kinematic_viscosity.property("value").UserString |
| self.material = d |
|
|