From aab45fdf6b962df2e48690e4145bde0ca170eff8 Mon Sep 17 00:00:00 2001 From: David Carter Date: Sun, 17 Mar 2024 23:59:14 -0400 Subject: [PATCH 1/3] Material: Add thermal reference temperature Fixes #13019 Adds the property 'Thermal Expansion Reference Temperature' to the Thermal properties --- src/Mod/Material/Resources/Models/Thermal/Thermal.yml | 8 ++++++++ src/Mod/Material/materialtests/TestMaterials.py | 2 +- tests/src/Mod/Material/App/TestMaterials.cpp | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Mod/Material/Resources/Models/Thermal/Thermal.yml b/src/Mod/Material/Resources/Models/Thermal/Thermal.yml index 5bbf0a137e044..6a102919c63dd 100644 --- a/src/Mod/Material/Resources/Models/Thermal/Thermal.yml +++ b/src/Mod/Material/Resources/Models/Thermal/Thermal.yml @@ -48,3 +48,11 @@ Model: Description: > Thermal expansion coefficient (linear) in [FreeCAD ThermalExpansionCoefficient unit] + ThermalExpansionReferenceTemperature: + DisplayName: "Thermal Expansion Reference Temperature" + Type: 'Quantity' + Units: 'K' + URL: '' + Description: > + The reference temperature is the temperature at which zero thermal + strains exist for the analysis. diff --git a/src/Mod/Material/materialtests/TestMaterials.py b/src/Mod/Material/materialtests/TestMaterials.py index 86f3104584860..7bf7ba3925edd 100644 --- a/src/Mod/Material/materialtests/TestMaterials.py +++ b/src/Mod/Material/materialtests/TestMaterials.py @@ -67,7 +67,7 @@ def testCalculiXSteel(self): self.assertTrue(steel.isPhysicalModelComplete(self.uuids.Density)) self.assertFalse(steel.isPhysicalModelComplete(self.uuids.IsotropicLinearElastic)) - self.assertTrue(steel.isPhysicalModelComplete(self.uuids.Thermal)) + self.assertFalse(steel.isPhysicalModelComplete(self.uuids.Thermal)) self.assertFalse(steel.isPhysicalModelComplete(self.uuids.LinearElastic)) self.assertTrue(steel.isAppearanceModelComplete(self.uuids.BasicRendering)) diff --git a/tests/src/Mod/Material/App/TestMaterials.cpp b/tests/src/Mod/Material/App/TestMaterials.cpp index b0c5080569a0e..024023d4ea86a 100644 --- a/tests/src/Mod/Material/App/TestMaterials.cpp +++ b/tests/src/Mod/Material/App/TestMaterials.cpp @@ -239,7 +239,7 @@ TEST_F(TestMaterial, TestCalculiXSteel) EXPECT_TRUE(steel->isPhysicalModelComplete(Materials::ModelUUIDs::ModelUUID_Mechanical_Density)); // Density EXPECT_FALSE(steel->isPhysicalModelComplete(Materials::ModelUUIDs::ModelUUID_Mechanical_IsotropicLinearElastic)); // IsotropicLinearElastic - incomplete - EXPECT_TRUE(steel->isPhysicalModelComplete(Materials::ModelUUIDs::ModelUUID_Thermal_Default)); // Thermal + EXPECT_FALSE(steel->isPhysicalModelComplete(Materials::ModelUUIDs::ModelUUID_Thermal_Default)); // Thermal EXPECT_FALSE(steel->isPhysicalModelComplete(Materials::ModelUUIDs::ModelUUID_Mechanical_LinearElastic)); // Legacy linear elastic - Not in the model EXPECT_TRUE(steel->isAppearanceModelComplete(Materials::ModelUUIDs::ModelUUID_Rendering_Basic)); // BasicRendering - inherited from Steel.FCMat From 60f0ba3e5922a257be63d54aed10d3a89bbf0ae3 Mon Sep 17 00:00:00 2001 From: David Carter Date: Tue, 19 Mar 2024 06:28:10 -0400 Subject: [PATCH 2/3] Fix delegates --- src/Mod/Material/Gui/BaseDelegate.cpp | 15 +++++++++++---- src/Mod/Material/Gui/MaterialDelegate.cpp | 16 +++++++++------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/Mod/Material/Gui/BaseDelegate.cpp b/src/Mod/Material/Gui/BaseDelegate.cpp index 3f75d52fb86a6..2052291dcf173 100644 --- a/src/Mod/Material/Gui/BaseDelegate.cpp +++ b/src/Mod/Material/Gui/BaseDelegate.cpp @@ -106,8 +106,13 @@ void BaseDelegate::paintQuantity(QPainter* painter, else { QVariant item = getValue(index); auto quantity = item.value(); - QString text = quantity.getUserString(); - painter->drawText(option.rect, 0, text); + if (quantity.isValid()) { + QString text = quantity.getUserString(); + painter->drawText(option.rect, 0, text); + } + else { + painter->drawText(option.rect, 0, QString()); + } } painter->restore(); @@ -350,8 +355,10 @@ void BaseDelegate::setModelData(QWidget* editor, } else if (type == Materials::MaterialValue::Quantity) { auto input = dynamic_cast(editor); - value = input->text(); - return; + // value = input->text(); + // return; + auto quantity = Base::Quantity::parse(input->text()); + value = QVariant::fromValue(quantity); } else if (type == Materials::MaterialValue::Integer) { auto spinner = dynamic_cast(editor); diff --git a/src/Mod/Material/Gui/MaterialDelegate.cpp b/src/Mod/Material/Gui/MaterialDelegate.cpp index feff9ec196956..c095933fb9dbd 100644 --- a/src/Mod/Material/Gui/MaterialDelegate.cpp +++ b/src/Mod/Material/Gui/MaterialDelegate.cpp @@ -133,8 +133,10 @@ void MaterialDelegate::setValue(QAbstractItemModel* model, auto material = group->child(row, 1)->data().value>(); // auto propertyName = group->child(row, 0)->text(); auto propertyName = group->child(row, 0)->data().toString(); - material->getProperty(propertyName)->setValue(value); - group->child(row, 1)->setText(value.toString()); + std::string _name = propertyName.toStdString(); + auto property = material->getProperty(propertyName); + property->setValue(value); + group->child(row, 1)->setText(property->getString()); } notifyChanged(model, index); @@ -267,7 +269,7 @@ void MaterialDelegate::showImageModal(const QString& propertyName, QStandardItem dlg->adjustSize(); - //connect(dlg, &QDialog::finished, this, [&](int result) {}); + // connect(dlg, &QDialog::finished, this, [&](int result) {}); dlg->exec(); } @@ -281,7 +283,7 @@ void MaterialDelegate::showListModal(const QString& propertyName, QStandardItem* dlg->adjustSize(); - //connect(dlg, &QDialog::finished, this, [&](int result) {}); + // connect(dlg, &QDialog::finished, this, [&](int result) {}); dlg->exec(); } @@ -295,7 +297,7 @@ void MaterialDelegate::showMultiLineStringModal(const QString& propertyName, QSt dlg->adjustSize(); - //connect(dlg, &QDialog::finished, this, [&](int result) {}); + // connect(dlg, &QDialog::finished, this, [&](int result) {}); dlg->exec(); } @@ -310,7 +312,7 @@ void MaterialDelegate::showArray2DModal(const QString& propertyName, QStandardIt dlg->adjustSize(); - //connect(dlg, &QDialog::finished, this, [&](int result) {}); + // connect(dlg, &QDialog::finished, this, [&](int result) {}); dlg->exec(); } @@ -324,7 +326,7 @@ void MaterialDelegate::showArray3DModal(const QString& propertyName, QStandardIt dlg->adjustSize(); - //connect(dlg, &QDialog::finished, this, [&](int result) {}); + // connect(dlg, &QDialog::finished, this, [&](int result) {}); dlg->exec(); } From 9425d65d00dd14369268db086dc9dddb50f221b6 Mon Sep 17 00:00:00 2001 From: David Carter Date: Sat, 6 Apr 2024 09:56:44 -0400 Subject: [PATCH 3/3] Materials: editor issues handling Base::Quantity properties --- src/Mod/Material/App/Materials.cpp | 41 +++++++++++++++++++ src/Mod/Material/App/Materials.h | 5 +++ src/Mod/Material/Gui/BaseDelegate.cpp | 15 +++++-- src/Mod/Material/Gui/MaterialDelegate.cpp | 22 ++++++++-- src/Mod/Material/Gui/MaterialDelegate.h | 2 +- src/Mod/Material/Gui/MaterialsEditor.cpp | 2 +- src/Mod/Material/Gui/MaterialsEditor.h | 2 +- .../Standard/Metal/Titanium/Ti-6Al-4V.FCMat | 3 +- .../Models/Mechanical/LinearElastic.yml | 7 +++- 9 files changed, 87 insertions(+), 12 deletions(-) diff --git a/src/Mod/Material/App/Materials.cpp b/src/Mod/Material/App/Materials.cpp index a0bbc8882cea3..7a0de1576c522 100644 --- a/src/Mod/Material/App/Materials.cpp +++ b/src/Mod/Material/App/Materials.cpp @@ -828,6 +828,15 @@ void Material::setPhysicalValue(const QString& name, const std::shared_ptrsetValue(value); + } +} + void Material::setAppearanceValue(const QString& name, const QString& value) { setAppearanceEditState(name); @@ -856,6 +865,38 @@ void Material::setAppearanceValue(const QString& name, } } +void Material::setAppearanceValue(const QString& name, const QVariant& value) +{ + setAppearanceEditState(name); + + if (hasAppearanceProperty(name)) { + _appearance[name]->setValue(value); + } +} + +void Material::setValue(const QString& name, const QString& value) +{ + if (hasPhysicalProperty(name)) { + setPhysicalValue(name, value); + } + else if (hasAppearanceProperty(name)) { + setAppearanceValue(name, value); + } + else { + throw PropertyNotFound(); + } +} + +void Material::setValue(const QString& name, const QVariant& value) +{ + if (hasPhysicalProperty(name)) { + setPhysicalValue(name, value); + } + else { + throw PropertyNotFound(); + } +} + std::shared_ptr Material::getPhysicalProperty(const QString& name) { try { diff --git a/src/Mod/Material/App/Materials.h b/src/Mod/Material/App/Materials.h index d1cd5d0e093ff..e5c977d652fef 100644 --- a/src/Mod/Material/App/Materials.h +++ b/src/Mod/Material/App/Materials.h @@ -276,10 +276,15 @@ class MaterialsExport Material: public Base::BaseClass void setPhysicalValue(const QString& name, const Base::Quantity& value); void setPhysicalValue(const QString& name, const std::shared_ptr& value); void setPhysicalValue(const QString& name, const std::shared_ptr>& value); + void setPhysicalValue(const QString& name, const QVariant& value); void setAppearanceValue(const QString& name, const QString& value); void setAppearanceValue(const QString& name, const std::shared_ptr& value); void setAppearanceValue(const QString& name, const std::shared_ptr>& value); + void setAppearanceValue(const QString& name, const QVariant& value); + + void setValue(const QString& name, const QString& value); + void setValue(const QString& name, const QVariant& value); std::shared_ptr getPhysicalProperty(const QString& name); std::shared_ptr getPhysicalProperty(const QString& name) const; diff --git a/src/Mod/Material/Gui/BaseDelegate.cpp b/src/Mod/Material/Gui/BaseDelegate.cpp index 2052291dcf173..23ca20799a920 100644 --- a/src/Mod/Material/Gui/BaseDelegate.cpp +++ b/src/Mod/Material/Gui/BaseDelegate.cpp @@ -100,8 +100,10 @@ void BaseDelegate::paintQuantity(QPainter* painter, auto model = index.model(); painter->save(); + // Base::Console().Log("paintQuantity()\n"); if (newRow(model, index)) { painter->drawText(option.rect, 0, QString()); + // Base::Console().Log("paintQuantity('A')\n"); } else { QVariant item = getValue(index); @@ -109,9 +111,11 @@ void BaseDelegate::paintQuantity(QPainter* painter, if (quantity.isValid()) { QString text = quantity.getUserString(); painter->drawText(option.rect, 0, text); + // Base::Console().Log("paintQuantity('%s')\n", text.toStdString().c_str()); } else { painter->drawText(option.rect, 0, QString()); + // Base::Console().Log("paintQuantity('B')\n"); } } @@ -331,8 +335,9 @@ void BaseDelegate::setEditorData(QWidget* editor, const QModelIndex& index) cons return; } if (type == Materials::MaterialValue::Quantity) { - auto input = dynamic_cast(editor); - input->setQuantityString(item.toString()); + auto input = dynamic_cast(editor); + // input->setQuantityString(item.toString()); + input->setValue(item.value()); return; } if (type == Materials::MaterialValue::List || type == Materials::MaterialValue::ImageList) { @@ -354,10 +359,11 @@ void BaseDelegate::setModelData(QWidget* editor, value = chooser->fileName(); } else if (type == Materials::MaterialValue::Quantity) { - auto input = dynamic_cast(editor); + auto input = dynamic_cast(editor); // value = input->text(); // return; - auto quantity = Base::Quantity::parse(input->text()); + // auto quantity = Base::Quantity::parse(input->text()); + auto quantity = input->value(); value = QVariant::fromValue(quantity); } else if (type == Materials::MaterialValue::Integer) { @@ -383,6 +389,7 @@ void BaseDelegate::setModelData(QWidget* editor, } setValue(model, index, value); + // Q_EMIT model->dataChanged(index, index); } QWidget* BaseDelegate::createEditor(QWidget* parent, diff --git a/src/Mod/Material/Gui/MaterialDelegate.cpp b/src/Mod/Material/Gui/MaterialDelegate.cpp index c095933fb9dbd..062a026f503b2 100644 --- a/src/Mod/Material/Gui/MaterialDelegate.cpp +++ b/src/Mod/Material/Gui/MaterialDelegate.cpp @@ -113,6 +113,17 @@ QVariant MaterialDelegate::getValue(const QModelIndex& index) const // auto propertyName = group->child(row, 0)->text(); auto propertyName = group->child(row, 0)->data().toString(); propertyValue = material->getProperty(propertyName)->getValue(); + + Base::Console().Log( + "getValue(%s, %s)\n", + propertyName.toStdString().c_str(), + material->getProperty(propertyName)->getDictionaryString().toStdString().c_str()); + if (material->getProperty(propertyName)->getType() == Materials::MaterialValue::Quantity) { + Base::Console().Log( + "Quantity::getValue(%s, %s)\n", + propertyName.toStdString().c_str(), + propertyValue.value().getUserString().toStdString().c_str()); + } } return propertyValue; } @@ -137,6 +148,10 @@ void MaterialDelegate::setValue(QAbstractItemModel* model, auto property = material->getProperty(propertyName); property->setValue(value); group->child(row, 1)->setText(property->getString()); + + Base::Console().Log("setValue(%s, %s)\n", + _name.c_str(), + property->getString().toStdString().c_str()); } notifyChanged(model, index); @@ -163,7 +178,7 @@ void MaterialDelegate::notifyChanged(const QAbstractItemModel* model, Base::Console().Log("MaterialDelegate::notifyChanged() - marked altered\n"); Q_EMIT const_cast(this)->propertyChange(propertyName, - propertyValue.toString()); + propertyValue); } } @@ -447,11 +462,12 @@ QWidget* MaterialDelegate::createWidget(QWidget* parent, widget = combo; } else if (type == Materials::MaterialValue::Quantity) { - auto input = new Gui::InputField(parent); + // auto input = new Gui::InputField(parent); + auto input = new Gui::QuantitySpinBox(parent); input->setMinimum(std::numeric_limits::min()); input->setMaximum(std::numeric_limits::max()); input->setUnitText(getUnits(index)); - input->setPrecision(6); + // input->setPrecision(6); input->setValue(item.value()); widget = input; diff --git a/src/Mod/Material/Gui/MaterialDelegate.h b/src/Mod/Material/Gui/MaterialDelegate.h index 9a37cfc091119..967c9769fe559 100644 --- a/src/Mod/Material/Gui/MaterialDelegate.h +++ b/src/Mod/Material/Gui/MaterialDelegate.h @@ -73,7 +73,7 @@ class MaterialDelegate: public BaseDelegate Q_SIGNALS: /** Emits this signal when a property has changed */ - void propertyChange(const QString& property, const QString value); + void propertyChange(const QString& property, const QVariant& value); private: QWidget* createWidget(QWidget* parent, const QVariant& item, const QModelIndex& index) const; diff --git a/src/Mod/Material/Gui/MaterialsEditor.cpp b/src/Mod/Material/Gui/MaterialsEditor.cpp index b6166395a66c7..a2f73608a543f 100644 --- a/src/Mod/Material/Gui/MaterialsEditor.cpp +++ b/src/Mod/Material/Gui/MaterialsEditor.cpp @@ -332,7 +332,7 @@ void MaterialsEditor::onDescription() _material->setDescription(ui->editDescription->toPlainText()); } -void MaterialsEditor::propertyChange(const QString& property, const QString value) +void MaterialsEditor::propertyChange(const QString& property, const QVariant& value) { if (_material->hasPhysicalProperty(property)) { _material->setPhysicalValue(property, value); diff --git a/src/Mod/Material/Gui/MaterialsEditor.h b/src/Mod/Material/Gui/MaterialsEditor.h index eef3d20cabba3..73b91a123caa9 100644 --- a/src/Mod/Material/Gui/MaterialsEditor.h +++ b/src/Mod/Material/Gui/MaterialsEditor.h @@ -62,7 +62,7 @@ class MaterialsEditor: public QDialog void onSourceReference(const QString& text); void onDescription(); - void propertyChange(const QString& property, const QString value); + void propertyChange(const QString& property, const QVariant& value); void onInheritNewMaterial(bool checked); void onNewMaterial(bool checked); void onFavourite(bool checked); diff --git a/src/Mod/Material/Resources/Materials/Standard/Metal/Titanium/Ti-6Al-4V.FCMat b/src/Mod/Material/Resources/Materials/Standard/Metal/Titanium/Ti-6Al-4V.FCMat index 3aea34e579ad7..00bc35fb54fd2 100644 --- a/src/Mod/Material/Resources/Materials/Standard/Metal/Titanium/Ti-6Al-4V.FCMat +++ b/src/Mod/Material/Resources/Materials/Standard/Metal/Titanium/Ti-6Al-4V.FCMat @@ -20,7 +20,8 @@ Models: UltimateTensileStrength: "975.5 MPa" YieldStrength: "910 MPa" YoungsModulus: "114 GPa" - Hardness: "35 HRC" + Hardness: "35" + HardnessUnits: "HRC" Thermal: UUID: '9959d007-a970-4ea7-bae4-3eb1b8b883c7' SpecificHeat: "553.0 J/kg/K" diff --git a/src/Mod/Material/Resources/Models/Mechanical/LinearElastic.yml b/src/Mod/Material/Resources/Models/Mechanical/LinearElastic.yml index aabd4ea72b3af..8cdc8b9cf4a87 100644 --- a/src/Mod/Material/Resources/Models/Mechanical/LinearElastic.yml +++ b/src/Mod/Material/Resources/Models/Mechanical/LinearElastic.yml @@ -81,7 +81,12 @@ Model: URL: 'https://en.wikipedia.org/wiki/Stiffness' Description: "Stiffness (or Spring Stiffness) in [FreeCAD Stiffness unit]" Hardness: - Type: 'Quantity' + Type: 'Float' Units: '' URL: 'https://en.wikipedia.org/wiki/Mohs_scale' Description: "Hardness. FreeCAD does not currently support hardness units" + HardnessUnits: + Type: 'String' + Units: '' + URL: 'https://en.wikipedia.org/wiki/Mohs_scale' + Description: "Hardness units. FreeCAD does not currently support hardness units"