6

I have a quite complex rule-based symbology that is currently using millimetres as size units.

rule-based symbology

All third levels look the same, they just have different parents.

Is there a way to change symbol size units from millimetres to map units for every rule entry so I don't have to click each entry and switch (which would be a pain in the * for a few dozen entries)?

When I have a categorized approach, I have the general symbology, that I can easily change and then applies to all categories, but how do I achieve that with a rule-based symbology?

The same goes for other aspects, like symbol size. Can I change that size for all symbols at once? e. g. from 15 mu to 18 mu.

0

2 Answers 2

10

Use the following script in QGIS Code Editor. It also works on nested rules. Select the layer before running the script.

layer = iface.activeLayer()
renderer = layer.renderer().clone()

def set_output_unit(rules):
    for rule in rules.children():
        rule.symbol().setOutputUnit(1) # 1: MapUnits    
        if rule.children():
            set_output_unit(rule)

rules = renderer.rootRule()
set_output_unit(rules)

layer.setRenderer(renderer)
layer.triggerRepaint()

enter image description here

4
  • I am on my rulebased layer. could it have anything to do with nested styles and the parents not having any symbology on their own?
    – e-shirt
    Mar 6 at 11:30
  • It could be. Could you share a screenshot on how the rule-based symbology looks like? Mar 6 at 11:52
  • I added a picture. As you can see, two symbols I have manually changed to map units, the others didn't
    – e-shirt
    Mar 6 at 12:26
  • Ok. I've edited the answer. Now, it works on nested rules. Mar 7 at 20:18
9

Quick and dirty would be:

  • export Style as *.qml
  • open it in Notepad++ for example
  • search for: <Option value="MM" type="QString" name="line_width_unit"/>
  • replace with: <Option value="MapUnit" type="QString" name="line_width_unit"/>
  • import your style again

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.