From cbe634719d41d0d31a4132e03bcd96768e40ea14 Mon Sep 17 00:00:00 2001 From: Uwe Date: Thu, 9 Feb 2023 04:23:25 +0100 Subject: [PATCH] [Material] allow to use vectorial properties - for electromagnetics we have vector fields and thus need to specify components - as first step use the new material "Magnetization" - also get rid of annoying debug messages output on normal use in the material dialog --- src/Mod/Material/MaterialEditor.py | 40 +++++++------------ .../Material/StandardMaterial/TEMPLATE.FCMat | 8 ++++ src/Mod/Material/Templatematerial.yml | 26 +++++++++++- src/Mod/Material/materialtools/cardutils.py | 10 ++++- 4 files changed, 56 insertions(+), 28 deletions(-) diff --git a/src/Mod/Material/MaterialEditor.py b/src/Mod/Material/MaterialEditor.py index ad7353a690..55112f8be0 100644 --- a/src/Mod/Material/MaterialEditor.py +++ b/src/Mod/Material/MaterialEditor.py @@ -592,7 +592,6 @@ class MaterialsDelegate(QtGui.QStyledItemDelegate): return if column == 1: - row = index.row() PP = group.child(row, 0) @@ -602,7 +601,6 @@ class MaterialsDelegate(QtGui.QStyledItemDelegate): if TT: Type = TT.text() - else: Type = "String" @@ -612,15 +610,12 @@ class MaterialsDelegate(QtGui.QStyledItemDelegate): editor = matProperWidget(parent, matproperty, Type, Value) elif column == 0: - if group.text() == "User defined": editor = matProperWidget(parent) - else: return else: - return return editor @@ -632,21 +627,17 @@ class MaterialsDelegate(QtGui.QStyledItemDelegate): Type = editor.property("Type") model = index.model() item = model.itemFromIndex(index) - print("item1={}".format(item.text())) if Type == "Color": - color = editor.property("color") color = tuple([v/255.0 for v in color.getRgb()]) item.setText(str(color)) elif Type == "File": - lineEdit = editor.children()[1] item.setText(lineEdit.text()) else: - super(MaterialsDelegate, self).setEditorData(editor, index) @@ -670,31 +661,36 @@ def matProperWidget(parent=None, matproperty=None, Type="String", Value=None, # the user defined properties are of Type String and thus uses a "Gui::PrefLineEdit" - print(matproperty) - print(Type) - print(Value) - ui = FreeCADGui.UiLoader() if Type == "String": - widget = ui.createWidget("Gui::PrefLineEdit") elif Type == "URL": - widget = ui.createWidget("Gui::PrefLineEdit") elif Type == "File": - widget = ui.createWidget("Gui::FileChooser") if Value: lineEdit = widget.children()[1] lineEdit.setText(Value) elif Type == "Quantity" or Type == "Float": - + # the Gui::InputField is used for Floats too, because of the digits widget = ui.createWidget("Gui::InputField") - # print(matproperty) + + # for properties with an underscored number (vectorial values), + # we must strip the part after the first underscore to obtain the bound unit + # since in cardutils.py in def get_material_template + # the underscores were removed, we must first check for numbers + # and then for "Im" (denotes an imaginery value) + import re + if re.search(r'\d', matproperty): + matpropertyNum = matproperty.rstrip('0123456789') + matproperty = matpropertyNum + if matproperty.find("Im") != -1: + matproperty = matproperty.split("Im")[0] + if hasattr(FreeCAD.Units, matproperty): unit = getattr(FreeCAD.Units, matproperty) quantity = FreeCAD.Units.Quantity(1, unit) @@ -704,34 +700,27 @@ def matProperWidget(parent=None, matproperty=None, Type="String", Value=None, "Not known unit for property: {}. Probably the Quantity does not have a unit.\n" .format(matproperty) ) - # the Gui::InputField is used for Floats too, because of the digits elif Type == "Integer": - widget = ui.createWidget("Gui::UIntSpinBox") # elif Type == "Float": - # widget = ui.createWidget("Gui::PrefDoubleSpinBox") # has only 2 digit precision, but for example RelativePermittivity needs much more # see material card for Air, thus Workaround # a "Gui::InputField" without unit is used elif Type == "Enumerator": - widget = ui.createWidget("Gui::PrefComboBox") elif Type == "Boolean": - widget = ui.createWidget("Gui::PrefComboBox") widget.insertItems(0, ["", "False", "True"]) elif Type == "Vector": - widget = ui.createWidget("Gui::PrefLineEdit") elif Type == "Color": - widget = ui.createWidget("Gui::PrefColorButton") if Value: value = string2tuple(Value) @@ -740,7 +729,6 @@ def matProperWidget(parent=None, matproperty=None, Type="String", Value=None, widget.setProperty("color", color) else: - widget = QtGui.QLineEdit() if minimum is not None: diff --git a/src/Mod/Material/StandardMaterial/TEMPLATE.FCMat b/src/Mod/Material/StandardMaterial/TEMPLATE.FCMat index 8ddba3773d..ffdf2629b6 100644 --- a/src/Mod/Material/StandardMaterial/TEMPLATE.FCMat +++ b/src/Mod/Material/StandardMaterial/TEMPLATE.FCMat @@ -123,6 +123,14 @@ ElectricalConductivity = ; https://en.wikipedia.org/wiki/Permeability_(electromagnetism) RelativePermeability = +; The magnetization in [FreeCAD Magnetization unit]" +; https://en.wikipedia.org/wiki/Magnetization +Magnetization_1 = +Magnetization_2 = +Magnetization_3 = +Magnetization_Im_1 = +Magnetization_Im_2 = +Magnetization_Im_3 = [Architectural] ; Description to be updated diff --git a/src/Mod/Material/Templatematerial.yml b/src/Mod/Material/Templatematerial.yml index d7c40db263..74c77bded5 100644 --- a/src/Mod/Material/Templatematerial.yml +++ b/src/Mod/Material/Templatematerial.yml @@ -113,7 +113,7 @@ FractureToughness: Type: 'Float' URL: 'https://en.wikipedia.org/wiki/Fracture_toughness' - Description: "Unit MPa * m^0.5 is not possible ATM in FreeCAD nicht moeglich thus String. Keep in mind the unit is fixed MPa * m^0.5. https://github.com/FreeCAD/FreeCAD/pull/2156" + Description: "Unit MPa * m^0.5 is not possible ATM in FreeCAD thus String. Keep in mind the unit is fixed MPa * m^0.5. https://github.com/FreeCAD/FreeCAD/pull/2156" PoissonRatio: Type: 'Float' URL: 'https://en.wikipedia.org/wiki/Poisson%27s_ratio' @@ -168,6 +168,30 @@ Type: 'Float' URL: 'https://en.wikipedia.org/wiki/Permeability_(electromagnetism)' Description: "The ratio to the permeability of the vacuum" + Magnetization_1: + Type: 'Quantity' + URL: 'https://en.wikipedia.org/wiki/Magnetization' + Description: "Magnetization in x-direction in [FreeCAD Magnetization unit]" + Magnetization_2: + Type: 'Quantity' + URL: 'https://en.wikipedia.org/wiki/Magnetization' + Description: "Magnetization in y-direction in [FreeCAD Magnetization unit]" + Magnetization_3: + Type: 'Quantity' + URL: 'https://en.wikipedia.org/wiki/Magnetization' + Description: "Magnetization in z-direction in [FreeCAD Magnetization unit]" + Magnetization_Im_1: + Type: 'Quantity' + URL: 'https://en.wikipedia.org/wiki/Magnetization' + Description: "Magnetization, imagaginary part, in x-direction in [FreeCAD Magnetization unit]" + Magnetization_Im_2: + Type: 'Quantity' + URL: 'https://en.wikipedia.org/wiki/Magnetization' + Description: "Magnetization, imagaginary part, in y-direction in [FreeCAD Magnetization unit]" + Magnetization_Im_3: + Type: 'Quantity' + URL: 'https://en.wikipedia.org/wiki/Magnetization' + Description: "Magnetization, imagaginary part, in z-direction in [FreeCAD Magnetization unit]" - Architectural: Color: Type: 'String' diff --git a/src/Mod/Material/materialtools/cardutils.py b/src/Mod/Material/materialtools/cardutils.py index ef85c558f0..116bac0aa3 100644 --- a/src/Mod/Material/materialtools/cardutils.py +++ b/src/Mod/Material/materialtools/cardutils.py @@ -237,6 +237,11 @@ def get_material_template(withSpaces=False): new_group[gg] = {} for proper in list(group[gg].keys()): new_proper = re.sub(r"(\w)([A-Z]+)", r"\1 \2", proper) + # strip underscores of vectorial properties + new_proper = new_proper.replace("_", " ") + # this can lead to double spaces for imaginary properties + # e.g. "_Im_1", therefore remove one + new_proper = new_proper.replace(" ", " ") new_group[gg][new_proper] = group[gg][proper] new_template.append(new_group) template_data = new_template @@ -439,8 +444,11 @@ def write_cards_to_path(cards_path, cards_data, write_group_section=True, write_ # ***** material parameter units ********************************************* def check_parm_unit(param): # check if this parameter is known to FreeCAD unit system + # for properties with underscores (vectorial values), we must + # strip the part after the first underscore to obtain the bound unit from FreeCAD import Units - # FreeCAD.Console.PrintMessage('{}\n'.format(param)) + if param.find("_") != -1: + param = param.split("_")[0] if hasattr(Units, param): return True else: