[QGIS-Developer] Issue with determining Symbol size - Bug?

Nyall Dawson nyall.dawson at gmail.com
Sun Sep 6 16:24:56 PDT 2020


On Sat, 5 Sep 2020 at 02:16, C Hamilton <adenaculture at gmail.com> wrote:
>
> Try running this code. Make sure you have a point layer selected that is using single symbol symbology. The value that is returned is 0. In my case the units for the symbol are millimeters and a value of 5. I am using QGIS 3.14.15 on windows.
>
> canvas = iface.mapCanvas()
> context = QgsRenderContext.fromMapSettings(canvas.mapSettings())
> lyr = iface.activeLayer()
> rnd = lyr.renderer()
> sym = rnd.symbol()
> sym_size = QgsSymbolLayerUtils.estimateMaxSymbolBleed(sym, context)
> print(sym_size)
>
> I am not sure what estimateMaxSymbolBleed really does, but it doesn't seem to represent symbol size.

Hm - good catch. Turns out it's not implemented for most marker symbol
layer types, only line/polygons. That's simply a result of the
function only being used by core qgis code for line/polygon symbols
currently. We should fix that sometime (PR welcome, ping me if you'd
like assistance!)

Nyall


>
> Thanks,
>
> Calvin
>
>
>
> On Thu, Sep 3, 2020 at 7:13 PM Nyall Dawson <nyall.dawson at gmail.com> wrote:
>>
>> On Thu, 3 Sep 2020 at 00:06, C Hamilton <adenaculture at gmail.com> wrote:
>> >
>> > Nyall,
>> >
>> > Thanks. This almost gets the right answer. QgsSymbolLayerUtils::estimateMaxSymbolBleed is returning 0 as its value.  I'm not sure what the problem is with it. bounds() seems to work for small symbols which is probably all I'll need, but if the symbol is very large with a large border and join style set to miter, the bounding box it returns is a little too small. My example used an excessively large icon and large border which probably would not be used in any real project.
>>
>> Hm - not sure what your issue with estimateMaxSymbolBleed is. Are you
>> using data defined properties at all?
>>
>> Regarding the miter question -- that's something which none of the
>> symbol bounds checking functions currently available account for.
>>
>> Nyall
>>
>> >
>> > Calvin
>> >
>> > On Tue, Sep 1, 2020 at 6:39 PM Nyall Dawson <nyall.dawson at gmail.com> wrote:
>> >>
>> >> On Wed, 2 Sep 2020 at 03:39, C Hamilton <adenaculture at gmail.com> wrote:
>> >> >
>> >> > I am trying to calculate the size of a single symbol in pixels using:
>> >> >
>> >> > canvas = iface.mapCanvas()
>> >> > context = QgsRenderContext.fromMapSettings(canvas.mapSettings())
>> >> > layer = iface.activeLayer()
>> >> > rnd = layer.renderer()
>> >> > sym = rnd.symbol()
>> >> > scaled_size_in_pixels = context.convertToPainterUnits(
>> >> >     sym.size(),
>> >> >     sym.sizeUnit(),
>> >> >     sym.sizeMapUnitScale() )
>> >> >
>> >> > The last line can also be calculated by:
>> >> >
>> >> >   scaled_size_in_pixels = sym.size(context)
>> >> >
>> >> > I am finding that this is returning the size of the filled area of the symbol, but it does not include the border. Is this a bug or do I need to add something additional to include the border?
>> >>
>> >> You can use  QgsSymbolLayerUtils::estimateMaxSymbolBleed if you're
>> >> wanting to calculate the "maximum" bounding box of a rendered symbol.
>> >> That includes any stroke/offset/other settings which also affect the
>> >> rendered bounds.
>> >>
>> >> There's also QgsMarkerSymbol::bounds which returns an approximate
>> >> bounding box of a marker symbol, which also accounts for things like
>> >> the stroke and offset.
>> >>
>> >> Nyall
>> >>
>> >>
>> >> >
>> >> > Thanks,
>> >> >
>> >> > Calvin
>> >> >
>> >> > _______________________________________________
>> >> > QGIS-Developer mailing list
>> >> > QGIS-Developer at lists.osgeo.org
>> >> > List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer
>> >> > Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer


More information about the QGIS-Developer mailing list