On Sat, 5 Sep 2020 at 02:16, C Hamilton <[email protected]> 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 <[email protected]> wrote: >> >> On Thu, 3 Sep 2020 at 00:06, C Hamilton <[email protected]> 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 <[email protected]> wrote: >> >> >> >> On Wed, 2 Sep 2020 at 03:39, C Hamilton <[email protected]> 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 >> >> > [email protected] >> >> > List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer >> >> > Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer _______________________________________________ QGIS-Developer mailing list [email protected] List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer
