freecad-cam/Mod/Material/materialtests/TestMaterialCreation.py
2026-02-01 01:59:24 +01:00

152 lines
7.4 KiB
Python

#**************************************************************************
# Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# *
# This file is part of the FreeCAD CAx development system. *
# *
# 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. *
# *
# FreeCAD 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 FreeCAD; if not, write to the Free Software *
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# USA *
#**************************************************************************
"""
Test module for FreeCAD material cards and APIs
"""
import unittest
import FreeCAD
import Materials
import os
parseQuantity = FreeCAD.Units.parseQuantity
class MaterialCreationTestCases(unittest.TestCase):
"""
Test class for FreeCAD material creation and APIs
"""
def setUp(self):
""" Setup function to initialize test data """
self.ModelManager = Materials.ModelManager()
self.MaterialManager = Materials.MaterialManager()
self.uuids = Materials.UUIDs()
def tearDown(self):
try:
material = self.MaterialManager.getMaterialByPath("Example/Frakenstein.FCMat", "User")
os.remove(material.LibraryRoot + "/Example/Frakenstein.FCMat")
try:
os.rmdir(material.LibraryRoot + "/Example")
except OSError:
# Can't remove directories that aren't empty
pass
except LookupError:
pass
def checkNewMaterial(self, material):
""" Check the state of a newly created material """
self.assertEqual(len(material.UUID), 36)
self.assertEqual(len(material.Name), 0)
self.assertEqual(len(material.Author), 0)
self.assertEqual(len(material.License), 0)
self.assertEqual(len(material.Description), 0)
self.assertEqual(len(material.URL), 0)
self.assertEqual(len(material.Reference), 0)
self.assertEqual(len(material.Parent), 0)
self.assertEqual(len(material.Tags), 0)
def testCreateMaterial(self):
""" Create a material with properties """
material = Materials.Material()
self.checkNewMaterial(material)
material.Name = "Frankenstein"
material.Author = "Mary Shelley"
material.License = "CC-BY-3.0"
material.Description = "The sad story of a boy afraid of fire"
material.URL = "https://www.example.com"
material.Reference = "ISBN 978-1673287882"
# Ensure a valid UUID
self.assertEqual(len(material.UUID), 36)
uuid = material.UUID
self.assertEqual(material.Name, "Frankenstein")
self.assertEqual(material.Author, "Mary Shelley")
self.assertEqual(material.License, "CC-BY-3.0")
self.assertEqual(material.Description, "The sad story of a boy afraid of fire")
self.assertEqual(material.URL, "https://www.example.com")
self.assertEqual(material.Reference, "ISBN 978-1673287882")
self.assertEqual(len(material.PhysicalModels), 0)
self.assertEqual(len(material.AppearanceModels), 0)
material.addAppearanceModel(self.uuids.TextureRendering)
self.assertEqual(len(material.AppearanceModels), 1)
# TextureRendering inherits BasicRendering
self.assertTrue(material.hasAppearanceModel(self.uuids.BasicRendering))
self.assertTrue(material.hasAppearanceModel(self.uuids.TextureRendering))
# Colors are tuples of 3 (rgb) or 4 (rgba) values between 0 and 1
# All values are set with strings
material.setAppearanceValue("DiffuseColor", "(1.0, 1.0, 1.0)")
material.setAppearanceValue("SpecularColor", "(0, 0, 0, 1.0)")
self.assertEqual(material.AppearanceProperties["DiffuseColor"], "(1.0, 1.0, 1.0)")
self.assertEqual(material.getAppearanceValue("DiffuseColor"), "(1.0, 1.0, 1.0)")
self.assertEqual(material.AppearanceProperties["SpecularColor"], "(0, 0, 0, 1.0)")
self.assertEqual(material.getAppearanceValue("SpecularColor"), "(0, 0, 0, 1.0)")
# Properties without a value will return None
self.assertIsNone(material.getAppearanceValue("AmbientColor"))
self.assertIsNone(material.getAppearanceValue("EmissiveColor"))
self.assertIsNone(material.getAppearanceValue("Shininess"))
self.assertIsNone(material.getAppearanceValue("Transparency"))
self.assertIsNone(material.getAppearanceValue("TexturePath"))
self.assertIsNone(material.getAppearanceValue("TextureImage"))
self.assertIsNone(material.getAppearanceValue("TextureScaling"))
material.addPhysicalModel(self.uuids.Density)
self.assertEqual(len(material.PhysicalModels), 1)
self.assertTrue(material.hasPhysicalModel(self.uuids.Density))
# 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)
# MaterialManager is unaware of the material until it is saved
#
# When initially creating the material, setting overwrite=True preserves the UUID. This should not
# be used when saving after properties have been edited as this could adversely affect other
# documents or parts using the same material. Setting overwrite=False, or omitting it, will change
# the UUID. It will also fail if the material file already exists.
#
# Similarly, saveAsCopy=True preserves the UUID and should be used carefully. It will save an
# identical copy of the original but in a different location.
#
# The third optional parameter is saveInherited. When set to true it will mark models and properties
# as inherited without duplicating them. When false, they will be copied as uninherited. Avoid
# self-inheritance as this creates an invalid model. It will have a different UUID than the original.
#
self.MaterialManager.save("User", material, "Example/Frakenstein.FCMat", overwrite=True)
# Now the UUID is valid
self.assertEqual(len(material.UUID), 36)
self.assertEqual(material.UUID, uuid)
self.assertIn(uuid, self.MaterialManager.Materials)
self.assertIsNotNone(self.MaterialManager.getMaterialByPath("Example/Frakenstein.FCMat", "User"))
self.assertIsNotNone(self.MaterialManager.getMaterial(uuid))