Historical example · test the target property in your Blender version Original context: 2023; PME and Blender versions were not stated.
Outcome
Drive one PME Property from the active object while applying an intentional change to every compatible selected object. This is useful for values such as opacity, display size, or a custom numeric property when a normal multi-edit should preserve each object’s relationship to the active one.
Choose the update rule first
| Rule | Effect on the selected objects | Good for |
|---|---|---|
| Same value | Every object receives the slider’s exact value. | A shared, uniform setting. |
| Delta | Every object moves by the active object’s change. | Preserving differences between values. |
| Ratio | Every object is scaled by the active object’s relative change. | Values where proportional change is meaningful. |
The historical example used Object.color[3] as the target. Treat that only as an example target: the reusable part is the selected-set update policy, not the particular Blender property.
A guarded same-value setter
Use a getter for the active object’s displayed value, then update only selected objects that expose the target attribute:
# Getter
return C.active_object.color[3] if C.active_object and hasattr(C.active_object, "color") else 0.0# Setter
[o.color.__setitem__(3, value) for o in C.selected_objects if hasattr(o, "color")]This is a compact PME form. Test a new target against one object in Blender’s Python Console before applying it to a selection.
Delta and ratio are different promises
For a delta, compare the incoming value with the active object’s old value, then add that difference to the other objects. Clamp only when the property has a known valid range:
# Readable form: adapt `read` and `write` to the property you own.
old_active = read(active)
delta = value - old_active
write(active, value)
for obj in selected:
if supports_target(obj) and obj is not active:
write(obj, clamp(read(obj) + delta))A ratio instead multiplies the other values by value / old_active. It needs an explicit zero-value policy. The source example chose 0 when the old active value was zero; that may not be the right behavior for your own control.
Pitfalls
- The active object provides the getter value; filter the selection to objects that support the target property.
- Avoid hiding a type error with a broad
except. Filter or validate the target objects before writing. - Define the intended zero-crossing behavior before using a ratio with values that can be negative.
- One-line setters are hard to audit. Move a non-trivial rule to an external Python script before it becomes a maintenance burden.
- Test Undo, keyframing, linked data, and mixed object types with a disposable
.blendfile.
Related
- Bind a PME Property to a Blender value
- Use props() to access a PME Property
- Use Properties as options for one Macro