Page MenuHome

Properties UI: Multiple objects
Closed, DuplicatePublic

Description

The Properties Editor is for editing the settings and properties of datablocks in Blender.

The Issue
The properties can only act on one item at a time. If you've selected five objects and want to change the same setting across all five, you've got to jump through hoops to make it possible:

Either, you can use the Copy menu to copy settings from active -> selected (only works for a few settings)
You can also right-click and select Copy To Selected, which copies the given setting from active -> selected

Here's why this is a problem:

  • Having to right-click and select Copy to Selected on every property every time you change it is inefficient, and not fun
  • It doesn't work for some things, like adding modifiers, setting up rigid bodies etc
  • It's quite complicated solution and is hidden
  • Some tools have been added to work around this limitation (Rigid Body Tools) whose only reason for being is to apply certain settings to multiple objects

Proposed Solution
Make the Properties Editor act on multiple selections. Display a '-' symbol for settings that differ, and display the value for settings that match.

Advantages:

  • No need to right-click and select a menu item for every single property change
  • It's clearer and simpler for the user
  • This way we don't need separate 'tools' such as Rigid Body Tools just to apply settings to multiple objects

Example:

Details

Type
Design

Event Timeline

William Reynish (billrey) set Type to Design.
William Reynish (billrey) raised the priority of this task from to Needs Triage by Developer.

There are two different ways to implement this.
1: When you change the value of properties, do you want all the properties to go the same.
2: When you change the value of properties, do you want all the properties to have a relative change.

Example for 2.
I have two lamps, the Z rotations are 1.5 and 1.7.
When i increase the value, it would go from [1.5, 1.7] to [2.1, 2.3].
This would be displayed with a +0.6.

Brecht Van Lommel (brecht) triaged this task as Confirmed, Low priority.

Marking this as low priority not because it's not important, but because it's a big project and not likely to be implemented soon.

How this will work in some areas is still unclear to me. For example object groups, modifiers, constraints, materials, textures, .. it's not entirely clear to me what would be displayed there. In general each object will have a list of things that may or may not match the others. Do you display that list only if it matches and otherwise blank or just for one object? Do you merge those lists (but do you really want to display all modifiers if you select a 1000 objects)?

When you change the value of properties, do you want all the properties to go the same.

This is the standard behavior in other applications I think. There could be some way that you can do a relative values, but that would be an extra feature, not the default.

From a technical perspective, there's a bunch of challenges here. How to handle this in the UI toolkit, how to expose such groups of objects to python UI scripts, how to handle the slowness when you select 1000 objects in a scene x 100 properties, etc.

koil (koilz) added a comment.EditedDec 20 2013, 9:50 PM

I guess this requires some good design before its considered.

For the lag problem, one feature could be limit to 10, or limit to custom number, this would prevent blender from freezing.
I think it would be best to test on small things first, like Transform properties.

Ive added a picture of how this could work, but im not sure how hard this would be to implement.

@Brecht Van Lommel (brecht): For modifiers, it could show all the ones that are common among objects? Although I realise you can have more than one of the same modifier on the same object. Not sure what to do in that case.

Regarding slowness, you mean that it would have to compare values across many objects to figure out what to display? Yes, that's true. I wonder how other apps do this without much overhead.

@Brecht Van Lommel (brecht):

How this will work in some areas is still unclear to me. For example object groups, modifiers, constraints, materials, textures, .. it's not entirely clear to me what would be displayed there. In general each object will have a list of things that may or may not match the others. Do you display that list only if it matches and otherwise blank or just for one object? Do you merge those lists (but do you really want to display all modifiers if you select a 1000 objects)?

More thinking: I think it's ok to keep this fairly simple. If a list differs, just put a dash and don't display anything. I don't think we need to get into complicated merging of lists and things like that - at least not initially.

Trouble is, what to do with materials/mesh data etc? These can be shared among objects, but can also differ. They're not part of an object, they are linked to it.

It seems logical that if Object A and Object B have different materials, you should be able to select those objects and make changes across both materials. Say you want to make objects green, but still have different materials. But how to handle that?

Here are some options:

  1. If you select two objects with different active materials, show those materials in the top in the little 'path' breadcrumb, and users can then edit values across those materials.
  2. Merge list of materials and let users choose inside the list box what the scope of the changes should be (deselect material X to make changes not apply to that)
  3. Assume that changes should be done to all linked materials on all selected objects
  4. Don't support materials and mesh data for this

I imagine this could become fairly complicated, editing multiple materials. How to handle nodes etc internally I don't know. I think it's probably ok to leave materials out.

Seems to me that editing of properties is pretty straight forward (at least as far as the user display is concerned). But like @Brecht Van Lommel (brecht) mentioned, it starts to get quite complicated when you start looking at materials, modifiers, etc.

Some other software packages solve this by not displaying them, but by requiring the user to open a floating window by double clicking on the material, layer, modifiers, etc. This makes it easy to select many objects but then specify the one you wish to work on further.

However, that is a very un-Blender approach and is not a good one in my opinion. I don't know that you can easily display datablocks for multiple objects at the same time with the current design, but you could make it a hybrid display. For example, if a single object is select it would display the material (or other datablock) exactly like it does now. But if multiple objects are selected then it would present a list of those objects within the properties panel, allowing you specify which one to work on.

Regardless, these are big changes that require careful design.

I'm glad to see this topic being discussed by developers. This seems to be a good place to share my proposal. I think the best solution is through making a robust Outliner, which needs a massive overhaul on it's own.

I hope the explanations in the following images are good enough...

Not sure if possible / convenient, but what would You say for a specifically designed pop-up window (or whatever panel) that appears only if multiple objects are selected and some keyboard shortcut pressed? It could look similar (in some ways...) as outliner, containing list of values common to all selected objects (so a dynamic list). Then it can have a field near every value, in which You can put expressions like "+0,5", "*7" etc, and "0" (disabled) or "1" (enabled) where applicable. Near this field there could be a dropdown menu with the type of action, where You can choose "linear" or "incremental".

EXAMPLE:

You selected three objects and pressed the keyboard shortcut. The list appears which contains:

Value 1 --> [modification field] --> dropdown menu

Let's say You want to place every object on different layer, so You search for a "Layer" line, and type:

Layer --> [+1] --> [incremental] (it adds 1 to Layer index of every object selected, incrementally, so the first one is +1, second is +2 etc).

A downside of this solution is that it's only applicable for numeric data, so I think it could serve only as a starting point, not a complete solution.