Files
blender/tests/python/bl_geometry_attributes.py
Hans Goudey 68759af516 Attributes: Use AttributeStorage for curves and Grease Pencil
This commit moves Curves and Grease Pencil to use `AttributeStorage`
instead of `CustomData`, except for vertex groups. This PR mostly
involves extending the changes from the above commit for point clouds
to generalize to other geometry types.

This is mostly straightforward, though a couple non-trivial places of
note are the joining of Grease Pencil objects (`merge_attributes`), the
"default render fallback" UV for curves objects which was previously
unused at the UI level and just ended up being the first attribute, and
the `update_curve_types()` call in the curves versioning function.

Similar to:
- fa03c53d4a
- f74e304b00

Part of #122398.

Pull Request: https://projects.blender.org/blender/blender/pulls/140936
2025-07-01 16:30:00 +02:00

75 lines
2.7 KiB
Python

# SPDX-FileCopyrightText: 2024 Blender Authors
#
# SPDX-License-Identifier: Apache-2.0
# ./blender.bin --background --python tests/python/bl_geometry_attributes.py -- --verbose
import bpy
import unittest
class TestCurves(unittest.TestCase):
def setUp(self):
self.curves = bpy.data.hair_curves.new("test")
# 50 points, 4 curves
self.curves.add_curves([5, 10, 15, 20])
def tearDown(self):
bpy.data.hair_curves.remove(self.curves)
del self.curves
def test_add_attribute(self):
a = self.curves.attributes.new("a", 'FLOAT', 'POINT')
self.assertTrue(a.name == "a")
self.assertTrue(a.data_type == 'FLOAT')
self.assertTrue(a.domain == 'POINT')
self.assertTrue(a.storage_type == 'ARRAY')
self.assertFalse(a.is_internal)
self.assertTrue(len(a.data) == 50)
def test_is_required(self):
a = self.curves.attributes.new("a", 'FLOAT', 'POINT')
self.assertFalse(a.is_required)
self.assertTrue(self.curves.attributes["position"].is_required)
def test_pointer_stability_on_add(self):
attrs = [self.curves.attributes.new("a" + str(i), 'FLOAT', 'POINT') for i in range(100)]
for i in range(100):
self.assertTrue(attrs[i].name == "a" + str(i))
self.assertTrue(attrs[i].data_type == 'FLOAT')
self.assertTrue(attrs[i].domain == 'POINT')
# Remove some attributes
for i in range(50):
self.curves.attributes.remove(attrs[i])
del attrs[i]
self.assertTrue(len(self.curves.attributes) == 51)
self.assertTrue(self.curves.attributes["a51"].name == "a51")
def test_add_same_name(self):
a = self.curves.attributes.new("a", 'FLOAT', 'POINT')
b = self.curves.attributes.new("a", 'BOOLEAN', 'CURVE')
self.assertFalse(a.name == b.name)
def test_add_wrong_domain(self):
with self.assertRaises(RuntimeError):
self.curves.attributes.new("a", 'FLOAT', 'CORNER')
def rename_attribute(self, name, new_name):
with self.assertRaises(RuntimeError):
self.curves.attributes["position"].name = "asjhfksjhdfkjsh"
a = self.curves.attributes.new("a", 'FLOAT', 'POINT')
a.name = "better_name"
self.assertTrue(a.name == "better_name")
self.assertTrue(self.curves.attributes["better_name"].name == "better_name")
def test_long_name(self):
self.curves.attributes.new("a" * 100, 'FLOAT', 'POINT')
self.assertTrue(self.curves.attributes["a" * 100].name == "a" * 100)
if __name__ == '__main__':
import sys
sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [])
unittest.main()