https://www.patreon.com/posts/blender-add-on-137855336
currently, the Geometry Attributes system lacks a convenient editing interface.
to edit a custom attribute value on selected geometry, we can use the Set Attribute operator, but it is very rudimentary. it was created in the first place as a “simplest to implement” solution, as stated by the dev, and has remained in that state for over two years.
some problems with the operator:
- implemented as a pop-up
- slow to invoke (hidden in Edit mode menus, without default shortcut)
- works only in Edit mode
- doesn’t support Grease Pencil
- sets the same value for each selected element (no option to offset values individually, similar to Item panel inputs)
- works only with the active attribute, which must be selected separately in the Properties editor’s Attributes panel
- limited or no support for some domains and types like String, Quaternion, Matrix
- there are two separate Set Attribute operators for Mesh and Curve (should be implemented generically, like Transform operators)
some add-on devs have attempted solutions, but those are either outdated for Blender 4+ or incomplete: only for Mesh/Hair, only for Edit mode, only for specific domains & types etc.
so i thought it would be a good idea to make a solution for the artists i work with personally until Blender devs finally finish developing this functionality, or i acquire enough resources to contribute a fix myself.
features:
- an input field under Attributes list in Properties editor for Mesh and Curves.
it shows a mean of the values of the active attribute over selected elements (points, edges, faces, corners, splines).

two editing modes are available:- Set: editing of the specified value of each data-point in the selection — the displayed value is mean, and when applying any change, all values will be set to the same input value. this is how the built-in “Set Attribute” operator works.

- Offset: independent editing of the values — each data-point value is offsetted by the input slider change. this is similar to how XYZ median position input fields in the Item sidebar work.

- Set: editing of the specified value of each data-point in the selection — the displayed value is mean, and when applying any change, all values will be set to the same input value. this is how the built-in “Set Attribute” operator works.
- extra panel in the Properties editor for Grease Pencil for Attributes of the underlying Curves.

the input field allows editing the attribute values on the current frame. - modular code structure so that the add-on’s Python package can be дькжіалп as a regular module in your scripts.
- String domain is not treated as numeric data, so only first data-point from the selection is edited as the most reasonable feature design choice, and only simple “Set” editing mode is supported for now.
during the development i have learned much about the geometry attribute system, finding answers to why it still has not been done properly. due to many historical and architectural reasons there are some limitations, notably:
- Integer Vector and 8-Bit Integer type attribute values cannot be edited in Mesh data-blocks in Edit mode
- Quaternion and Matrix type attribute values cannot be edited in Mesh data-blocks in Edit mode
- 2D-Vector type attribute values and non-Corner domains cannot be edited in Mesh data-blocks in Edit mode
- attribute values of types not matching the selection domain cannot be edited in Grease Pencil data-blocks in Edit mode
contact information for customer support is revealed after a purchase.
at the core of the addon are two different APIs, for BMesh and for regular Attribute access. here are two snippets demonstrating the most simple cases to roughly understand what i am doing under the hood:
# given:
# - a Mesh data-block in Edit Mode,
# - an active attribute on domain Vertex and of type Integer,
# increment values on the selected points.
import bpy
import bmesh
data = bpy.context.object.data
att = data.attributes.active
bm = bmesh.from_edit_mesh(data)
seq_acc = bm.verts
lay_acc = seq_acc.layers.int
lay = lay_acc.get(att.name)
for elem in seq_acc:
if elem.select:
elem[lay] += 1
bmesh.update_edit_mesh(data)
bm.free()
# given:
# - a Curves data-block (Hair) in Edit Mode,
# - an active attribute on domain Point and of type Integer,
# - Control Point Select Mode,
# increment values on the selected points.
import bpy
import numpy as np
data = bpy.context.object.data
atts = data.attributes
att = atts.active
size = atts.domain_size('POINT')
sels = np.ones((size,), dtype = np.bool_)
sels_att = atts.get(".selection")
if sels_att is not None:
sels_att.data.foreach_get("value", sels)
vals = np.empty((size,), dtype = np.int32)
att.data.foreach_get("value", np.ravel(vals))
vals[sels] += 1
att.data.foreach_set("value", np.ravel(vals))
not all code looks that trivial due to complexities and limitations of the Python API. also, UI part is not just layout.prop(attribute, "value") but requires an adapter system, which will first compute the mean value, display it to the user, and broadcast the changes to all selected elements.
in summary, there is about 1300 significant lines of code to cover all the mentioned use cases: Mesh, (Hair) Curves, Grease Pencil (at the current frame), in both Object and Edit modes, and to build the UI.
during this time i have accumulated quite a bit of notes, knowledge, and WIP-scripts around Geometry Attribute editing via Python, so if you have any questions please feel free to ask, or just share your use cases.