Bug report #13033

Data defined settings at root Marker are copied to child Symbol Layer items

Added by Olivier Dalang over 5 years ago. Updated over 4 years ago.

Assignee:Nyall Dawson
Affected QGIS version:master Regression?:No
Operating System: Easy fix?:No
Pull Request or Patch supplied:Yes Resolution:
Crashes QGIS or corrupts data:No Copied to github as #:21108


Hi !

Steps :

While looking at #12769 I found that there's a problem in Symbol's data-defined properties such as size and rotation for point layers, and width for line layers.
Indeed, these properties are simply copied to children SymbolLayers (more or less cleverly to maintain the proportion) but are not truely defined at the symbol's root level. This leads to unexpected results:

1. When you create a new symbol level on an existing marker with data-defined scale, that new symbol level won't scale
2. When you data-define the width of a marker symbol, it sets all of the child's layers width to be data-defined, making the "width" field useless
3. When you change a child symbol layer's width expression, the root data-defined width doesn't work anymore, so that you must start over if you want to make changes.
4. and so on...

There seem to be something a bit wrong in the current implementation. I think we miss actual properties at root level.

One shouldn't define a size or thickness at root level, but a scale, which would then apply to the children's value at rendering time, not changing the children's properties values in the UI. That would make edition of complex symbols much easier, and usage of data-defined properties much more reliable.

Thanks !


Related issues

Related to QGIS Application - Feature request #12769: Data defined opacity for vector features Open 2015-05-19

Associated revisions

Revision cb104f0f
Added by Vincent Mora over 5 years ago

set data-defined size,angle,width for added symbol
fix #13033
When a symbol is added and the marker as a global size expression,
restore the expression if a symbol is added.


#1 Updated by Regis Haubourg over 5 years ago

  • Assignee set to Nyall Dawson

Hi, putting Nyall in the list, he reviewed the code from Vincent Mora (I funded that feature).

In fact, old implementation was also confusing, using root level size as a multiplicator of size advanced field/expression. Each symbol did that too, and we had some bad interactions between expression and scaling method (area was still used when defining an expression).
The idea here was to define a more user friendly expression, on root level so that common users use that. There is an assistant now for size varying, that allows to generate a legend too. Much more consistent, and using same expression widgets as in labeling GUI.

Adding a new symbol should indeed keep scaling applied, you are right. Having only a scaling factor on root level does not seem quite clear to me. Other opinions ?

#2 Updated by Nyall Dawson over 5 years ago

I originally thought the same (in fact, I got part way through coding it this way) but hit an issue.

Imagine the following situation. I want a marker symbol with three circle layers, one must always be 1mm diameter and the other two should have data defined size. If the data defined size was set and stored at the root level then there's no way to avoid the 1mm fixed size marker layer also changing size.

Perhaps my ideal implementation would be:
- data defined size stored at the root level. Data defined size is still set to a physical size (eg mm), but like the current implementation the individual layers are scaled depending on their relative sizes to the size set at the root level.
- a "lock value" option could be added to the data defined button to prevent the root data defined size from applying

That said, I think the only thing missing from the current implementation is that adding new layers should automatically have the dd size applied

#3 Updated by Vincent Mora over 5 years ago

  • Affected QGIS version changed from 2.8.2 to master


IMO if you are at the higher level, you want to control all thinks below, so I'm not fond of a lock below.

If you want to control the symbols sizes independently, you can still do that, we could add the assistant at the symbol level.

If I understand correctly, what you want is to be able to define the scale of several symbols, while defining the size differently for other symbols... sound like a list of makers to me.

For the ability to add new marker and change size, I think the solution is to reapply the marker DD expression (if its active) when something changes in the symbol list. Maybe also deactivating the corresponding DD buttons when a marker size, rotation or width is DD. I'm looking into that, but I can't find were to do it yet.

#4 Updated by Nyall Dawson over 5 years ago

If you want to control the symbols sizes independently, you can still do that, we could add the assistant at the symbol level

It's already there ;) it was too nice a feature to not make wide use of, so I added it during the hackfest.

#5 Updated by Vincent Mora over 5 years ago

  • Pull Request or Patch supplied changed from No to Yes

#6 Updated by Vincent Mora over 5 years ago

And this one is to keep size/angle expressions when subsymbol changes https://github.com/qgis/QGIS/pull/2167

#7 Updated by Vincent Mora over 5 years ago

  • Status changed from Open to Closed

Also available in: Atom PDF