Materials: Change display of Quantity values

The default display type of quantity objects is fixed point resulting
in insufficient accuracy when changing unit systems, or when the values
are small. This fix changes the default format from 'Fixed' to the more
apt 'Default' format. This allows the displayed values to scale as
appropriate.

Fixes #18149
This commit is contained in:
David Carter
2024-12-11 09:26:06 -05:00
committed by Chris Hennes
parent 939506007d
commit 7e1b1abddd
12 changed files with 179 additions and 86 deletions

View File

@@ -67,6 +67,12 @@ class MaterialCreationTestCases(unittest.TestCase):
self.assertEqual(len(material.Parent), 0)
self.assertEqual(len(material.Tags), 0)
def getQuantity(self, value):
quantity = parseQuantity(value)
quantity.Format = { "NumberFormat" : "g",
"Precision" : 6 }
return quantity
def testCreateMaterial(self):
""" Create a material with properties """
material = Materials.Material()
@@ -125,7 +131,8 @@ class MaterialCreationTestCases(unittest.TestCase):
# Quantity properties require units
material.setPhysicalValue("Density", "99.9 kg/m^3")
self.assertEqual(material.getPhysicalValue("Density").UserString, parseQuantity("99.90 kg/m^3").UserString)
self.assertEqual(material.getPhysicalValue("Density").Format["NumberFormat"], "g")
self.assertEqual(material.getPhysicalValue("Density").UserString, self.getQuantity("99.90 kg/m^3").UserString)
# MaterialManager is unaware of the material until it is saved
#

View File

@@ -46,6 +46,12 @@ class MaterialTestCases(unittest.TestCase):
self.assertIn("MaterialLibraries", dir(self.MaterialManager))
self.assertIn("Materials", dir(self.MaterialManager))
def getQuantity(self, value):
quantity = parseQuantity(value)
quantity.Format = { "NumberFormat" : "g",
"Precision" : 6 }
return quantity
def testCalculiXSteel(self):
"""
Test a representative material card for CalculX Steel
@@ -175,27 +181,27 @@ class MaterialTestCases(unittest.TestCase):
self.assertTrue(len(properties["SpecularColor"]) > 0)
self.assertTrue(len(properties["Transparency"]) > 0)
self.assertEqual(parseQuantity(properties["Density"]).UserString,
parseQuantity("7900.00 kg/m^3").UserString)
self.assertEqual(self.getQuantity(properties["Density"]).UserString,
self.getQuantity("7900.00 kg/m^3").UserString)
# self.assertEqual(properties["BulkModulus"], "")
self.assertAlmostEqual(parseQuantity(properties["PoissonRatio"]).Value,
parseQuantity("0.3").Value)
self.assertEqual(parseQuantity(properties["YoungsModulus"]).UserString,
parseQuantity("210.00 GPa").UserString)
self.assertAlmostEqual(self.getQuantity(properties["PoissonRatio"]).Value,
self.getQuantity("0.3").Value)
self.assertEqual(self.getQuantity(properties["YoungsModulus"]).UserString,
self.getQuantity("210.00 GPa").UserString)
# self.assertEqual(properties["ShearModulus"], "")
self.assertEqual(parseQuantity(properties["SpecificHeat"]).UserString,
parseQuantity("590.00 J/kg/K").UserString)
self.assertEqual(parseQuantity(properties["ThermalConductivity"]).UserString,
parseQuantity("43.00 W/m/K").UserString)
self.assertEqual(parseQuantity(properties["ThermalExpansionCoefficient"]).UserString,
parseQuantity("12.00 µm/m/K").UserString)
self.assertEqual(self.getQuantity(properties["SpecificHeat"]).UserString,
self.getQuantity("590.00 J/kg/K").UserString)
self.assertEqual(self.getQuantity(properties["ThermalConductivity"]).UserString,
self.getQuantity("43.00 W/m/K").UserString)
self.assertEqual(self.getQuantity(properties["ThermalExpansionCoefficient"]).UserString,
self.getQuantity("12.00 µm/m/K").UserString)
self.assertEqual(properties["AmbientColor"], "(0.0020, 0.0020, 0.0020, 1.0)")
self.assertEqual(properties["DiffuseColor"], "(0.0000, 0.0000, 0.0000, 1.0)")
self.assertEqual(properties["EmissiveColor"], "(0.0000, 0.0000, 0.0000, 1.0)")
self.assertAlmostEqual(parseQuantity(properties["Shininess"]).Value, parseQuantity("0.06").Value)
self.assertAlmostEqual(self.getQuantity(properties["Shininess"]).Value, self.getQuantity("0.06").Value)
self.assertEqual(properties["SpecularColor"], "(0.9800, 0.9800, 0.9800, 1.0)")
self.assertAlmostEqual(parseQuantity(properties["Transparency"]).Value,
parseQuantity("0").Value)
self.assertAlmostEqual(self.getQuantity(properties["Transparency"]).Value,
self.getQuantity("0").Value)
print("Density " + steel.getPhysicalValue("Density").UserString)
# print("BulkModulus " + properties["BulkModulus"])
@@ -226,6 +232,12 @@ class MaterialTestCases(unittest.TestCase):
self.assertEqual(steel.getAppearanceValue("SpecularColor"), "(0.9800, 0.9800, 0.9800, 1.0)")
self.assertAlmostEqual(steel.getAppearanceValue("Transparency"), 0.0)
self.assertEqual(steel.getPhysicalValue("Density").Format["NumberFormat"], "g")
self.assertEqual(steel.getPhysicalValue("YoungsModulus").Format["NumberFormat"], "g")
self.assertEqual(steel.getPhysicalValue("SpecificHeat").Format["NumberFormat"], "g")
self.assertEqual(steel.getPhysicalValue("ThermalConductivity").Format["NumberFormat"], "g")
self.assertEqual(steel.getPhysicalValue("ThermalExpansionCoefficient").Format["NumberFormat"], "g")
def testMaterialsWithModel(self):
"""
Test functions that return a list of models supporting specific material models
@@ -325,12 +337,19 @@ class MaterialTestCases(unittest.TestCase):
self.assertEqual(len(arrayData[1]), 2)
self.assertEqual(len(arrayData[2]), 2)
self.assertEqual(arrayData[0][0].UserString, parseQuantity("10.00 C").UserString)
self.assertEqual(arrayData[0][1].UserString, parseQuantity("10.00 kg/m^3").UserString)
self.assertEqual(arrayData[1][0].UserString, parseQuantity("20.00 C").UserString)
self.assertEqual(arrayData[1][1].UserString, parseQuantity("20.00 kg/m^3").UserString)
self.assertEqual(arrayData[2][0].UserString, parseQuantity("30.00 C").UserString)
self.assertEqual(arrayData[2][1].UserString, parseQuantity("30.00 kg/m^3").UserString)
self.assertEqual(arrayData[0][0].Format["NumberFormat"], "g")
self.assertEqual(arrayData[0][1].Format["NumberFormat"], "g")
self.assertEqual(arrayData[1][0].Format["NumberFormat"], "g")
self.assertEqual(arrayData[1][1].Format["NumberFormat"], "g")
self.assertEqual(arrayData[2][0].Format["NumberFormat"], "g")
self.assertEqual(arrayData[2][1].Format["NumberFormat"], "g")
self.assertEqual(arrayData[0][0].UserString, self.getQuantity("10.00 C").UserString)
self.assertEqual(arrayData[0][1].UserString, self.getQuantity("10.00 kg/m^3").UserString)
self.assertEqual(arrayData[1][0].UserString, self.getQuantity("20.00 C").UserString)
self.assertEqual(arrayData[1][1].UserString, self.getQuantity("20.00 kg/m^3").UserString)
self.assertEqual(arrayData[2][0].UserString, self.getQuantity("30.00 C").UserString)
self.assertEqual(arrayData[2][1].UserString, self.getQuantity("30.00 kg/m^3").UserString)
self.assertAlmostEqual(arrayData[0][0].Value, 10.0)
self.assertAlmostEqual(arrayData[0][1].Value, 1e-8)
@@ -346,12 +365,19 @@ class MaterialTestCases(unittest.TestCase):
with self.assertRaises(IndexError):
self.assertAlmostEqual(arrayData[0][2].Value, 10.0)
self.assertEqual(array.getValue(0,0).UserString, parseQuantity("10.00 C").UserString)
self.assertEqual(array.getValue(0,1).UserString, parseQuantity("10.00 kg/m^3").UserString)
self.assertEqual(array.getValue(1,0).UserString, parseQuantity("20.00 C").UserString)
self.assertEqual(array.getValue(1,1).UserString, parseQuantity("20.00 kg/m^3").UserString)
self.assertEqual(array.getValue(2,0).UserString, parseQuantity("30.00 C").UserString)
self.assertEqual(array.getValue(2,1).UserString, parseQuantity("30.00 kg/m^3").UserString)
self.assertEqual(array.getValue(0,0).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(0,1).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(1,0).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(1,1).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(2,0).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(2,1).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(0,0).UserString, self.getQuantity("10.00 C").UserString)
self.assertEqual(array.getValue(0,1).UserString, self.getQuantity("10.00 kg/m^3").UserString)
self.assertEqual(array.getValue(1,0).UserString, self.getQuantity("20.00 C").UserString)
self.assertEqual(array.getValue(1,1).UserString, self.getQuantity("20.00 kg/m^3").UserString)
self.assertEqual(array.getValue(2,0).UserString, self.getQuantity("30.00 C").UserString)
self.assertEqual(array.getValue(2,1).UserString, self.getQuantity("30.00 kg/m^3").UserString)
self.assertAlmostEqual(array.getValue(0,0).Value, 10.0)
self.assertAlmostEqual(array.getValue(0,1).Value, 1e-8)
@@ -410,69 +436,91 @@ class MaterialTestCases(unittest.TestCase):
self.assertEqual(len(arrayData[1]), 0)
self.assertEqual(len(arrayData[2]), 3)
self.assertEqual(arrayData[0][0][0].UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(arrayData[0][0][1].UserString, parseQuantity("12.00 Pa").UserString)
self.assertEqual(arrayData[0][1][0].UserString, parseQuantity("21.00 Pa").UserString)
self.assertEqual(arrayData[0][1][1].UserString, parseQuantity("22.00 Pa").UserString)
self.assertEqual(arrayData[2][0][0].UserString, parseQuantity("10.00 Pa").UserString)
self.assertEqual(arrayData[2][0][1].UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(arrayData[2][1][0].UserString, parseQuantity("20.00 Pa").UserString)
self.assertEqual(arrayData[2][1][1].UserString, parseQuantity("21.00 Pa").UserString)
self.assertEqual(arrayData[2][2][0].UserString, parseQuantity("30.00 Pa").UserString)
self.assertEqual(arrayData[2][2][1].UserString, parseQuantity("31.00 Pa").UserString)
self.assertEqual(arrayData[0][0][0].Format["NumberFormat"], "g")
self.assertEqual(arrayData[0][0][1].Format["NumberFormat"], "g")
self.assertEqual(arrayData[0][1][0].Format["NumberFormat"], "g")
self.assertEqual(arrayData[0][1][1].Format["NumberFormat"], "g")
self.assertEqual(arrayData[2][0][0].Format["NumberFormat"], "g")
self.assertEqual(arrayData[2][0][1].Format["NumberFormat"], "g")
self.assertEqual(arrayData[2][1][0].Format["NumberFormat"], "g")
self.assertEqual(arrayData[2][1][1].Format["NumberFormat"], "g")
self.assertEqual(arrayData[2][2][0].Format["NumberFormat"], "g")
self.assertEqual(arrayData[2][2][1].Format["NumberFormat"], "g")
self.assertEqual(array.getDepthValue(0).UserString, parseQuantity("10.00 C").UserString)
self.assertEqual(array.getDepthValue(1).UserString, parseQuantity("20.00 C").UserString)
self.assertEqual(array.getDepthValue(2).UserString, parseQuantity("30.00 C").UserString)
self.assertEqual(arrayData[0][0][0].UserString, self.getQuantity("11.00 Pa").UserString)
self.assertEqual(arrayData[0][0][1].UserString, self.getQuantity("12.00 Pa").UserString)
self.assertEqual(arrayData[0][1][0].UserString, self.getQuantity("21.00 Pa").UserString)
self.assertEqual(arrayData[0][1][1].UserString, self.getQuantity("22.00 Pa").UserString)
self.assertEqual(arrayData[2][0][0].UserString, self.getQuantity("10.00 Pa").UserString)
self.assertEqual(arrayData[2][0][1].UserString, self.getQuantity("11.00 Pa").UserString)
self.assertEqual(arrayData[2][1][0].UserString, self.getQuantity("20.00 Pa").UserString)
self.assertEqual(arrayData[2][1][1].UserString, self.getQuantity("21.00 Pa").UserString)
self.assertEqual(arrayData[2][2][0].UserString, self.getQuantity("30.00 Pa").UserString)
self.assertEqual(arrayData[2][2][1].UserString, self.getQuantity("31.00 Pa").UserString)
self.assertEqual(arrayData[0][0][-1].UserString, parseQuantity("12.00 Pa").UserString)
self.assertEqual(array.getDepthValue(0).UserString, self.getQuantity("10.00 C").UserString)
self.assertEqual(array.getDepthValue(1).UserString, self.getQuantity("20.00 C").UserString)
self.assertEqual(array.getDepthValue(2).UserString, self.getQuantity("30.00 C").UserString)
self.assertEqual(arrayData[0][0][-1].UserString, self.getQuantity("12.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(arrayData[0][0][2].UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(arrayData[0][-1][0].UserString, parseQuantity("21.00 Pa").UserString)
self.assertEqual(arrayData[0][0][2].UserString, self.getQuantity("11.00 Pa").UserString)
self.assertEqual(arrayData[0][-1][0].UserString, self.getQuantity("21.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(arrayData[0][2][0].UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(arrayData[0][2][0].UserString, self.getQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(arrayData[1][0][0].UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(arrayData[-1][0][0].UserString, parseQuantity("10.00 Pa").UserString)
self.assertEqual(arrayData[1][0][0].UserString, self.getQuantity("11.00 Pa").UserString)
self.assertEqual(arrayData[-1][0][0].UserString, self.getQuantity("10.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(arrayData[3][0][0].UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(arrayData[3][0][0].UserString, self.getQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getDepthValue(-1).UserString,
parseQuantity("10.00 C").UserString)
self.getQuantity("10.00 C").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getDepthValue(3).UserString,
parseQuantity("10.00 C").UserString)
self.getQuantity("10.00 C").UserString)
self.assertEqual(array.getValue(0,0,0).UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(array.getValue(0,0,1).UserString, parseQuantity("12.00 Pa").UserString)
self.assertEqual(array.getValue(0,1,0).UserString, parseQuantity("21.00 Pa").UserString)
self.assertEqual(array.getValue(0,1,1).UserString, parseQuantity("22.00 Pa").UserString)
self.assertEqual(array.getValue(2,0,0).UserString, parseQuantity("10.00 Pa").UserString)
self.assertEqual(array.getValue(2,0,1).UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(array.getValue(2,1,0).UserString, parseQuantity("20.00 Pa").UserString)
self.assertEqual(array.getValue(2,1,1).UserString, parseQuantity("21.00 Pa").UserString)
self.assertEqual(array.getValue(2,2,0).UserString, parseQuantity("30.00 Pa").UserString)
self.assertEqual(array.getValue(2,2,1).UserString, parseQuantity("31.00 Pa").UserString)
self.assertEqual(array.getValue(0,0,0).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(0,0,1).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(0,1,0).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(0,1,1).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(2,0,0).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(2,0,1).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(2,1,0).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(2,1,1).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(2,2,0).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(2,2,1).Format["NumberFormat"], "g")
self.assertEqual(array.getValue(0,0,0).UserString, self.getQuantity("11.00 Pa").UserString)
self.assertEqual(array.getValue(0,0,1).UserString, self.getQuantity("12.00 Pa").UserString)
self.assertEqual(array.getValue(0,1,0).UserString, self.getQuantity("21.00 Pa").UserString)
self.assertEqual(array.getValue(0,1,1).UserString, self.getQuantity("22.00 Pa").UserString)
self.assertEqual(array.getValue(2,0,0).UserString, self.getQuantity("10.00 Pa").UserString)
self.assertEqual(array.getValue(2,0,1).UserString, self.getQuantity("11.00 Pa").UserString)
self.assertEqual(array.getValue(2,1,0).UserString, self.getQuantity("20.00 Pa").UserString)
self.assertEqual(array.getValue(2,1,1).UserString, self.getQuantity("21.00 Pa").UserString)
self.assertEqual(array.getValue(2,2,0).UserString, self.getQuantity("30.00 Pa").UserString)
self.assertEqual(array.getValue(2,2,1).UserString, self.getQuantity("31.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(0,0,-1).UserString,
parseQuantity("11.00 Pa").UserString)
self.getQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(0,0,2).UserString,
parseQuantity("11.00 Pa").UserString)
self.getQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(0,-1,0).UserString,
parseQuantity("11.00 Pa").UserString)
self.getQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(0,2,0).UserString,
parseQuantity("11.00 Pa").UserString)
self.getQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(1,0,0).UserString,
parseQuantity("11.00 Pa").UserString)
self.getQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(-1,0,0).UserString,
parseQuantity("11.00 Pa").UserString)
self.getQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(3,0,0).UserString,
parseQuantity("11.00 Pa").UserString)
self.getQuantity("11.00 Pa").UserString)