Parameter for addShape for a child of a group in oox import
Regina Henschel
rb.henschel at t-online.de
Mon May 3 18:25:42 UTC 2021
Hi Miklos,
answer below.
Miklos Vajna schrieb am 03.05.2021 um 15:47:
> Hi Regina,
>
> On Fri, Apr 30, 2021 at 04:39:41PM +0200, Regina Henschel <rb.henschel at t-online.de> wrote:
>> So I still need a way to transport the values from the group to its
>> children. Besides my first idea to put all group infos into a struct and use
>> that instead of the aTransformation parameter, I can also think to put them
>> into the grabbag of each child.
>
> The primary purpose of the grabbag property of shapes is to carry
> information from the importer to the exporter, when the document model
> doesn't handle some information. So if you can solve this without
> grabbags, that would be nice. >
>> Such transport of information from group to child is also needed, if e.g. 3D
>> transformations are not made on the individual shapes but on the group.
>> MSOffice allows to apply attributes to the group and writes it that way to
>> file, but LibreOffice has no attributes on groups.
>
> Yes, that's what I recall as well, our group shape is just a container
> of shapes.
>
>> I'm still interested in you opinion how to design it.
>
> oox/ code creates oox::drawing::Shape instances, then once all of them
> is created, it turns them into XShapes ("creates and inserts them").
>
> Do you think it would be possible to improve
> oox::drawingml::Shape::createAndInsert(), so that it would get not only
> the parent transform but also the parent oox::drawing::Shape? If that
> would work, then setChildPosition() and setChildSize() already stores
> chOff/chExt values on the parent, and you could access the needed
> information.
That means, I do not sent the information to the child, but the child
fetches it from the parent. I like your idea.
Shape::addChildren() is called with a reference to the group shape. So
there the parent shape is known. It does not call
Shape::createAndInsert() directly, but calls Shape::addShape(), which
then calls Shape::createAndInsert().
So add a pointer to addShape() and to createAndInsert()? If they are
called first time, it would be a nullptr. Such pointer could likely
replace the 'bInGroup' parameter.
The parameter aTransformation in addShape() is still needed, because it
cumulates the transformations in case there are nested groups.
>
> If this doesn't work, then the above grabbag way is also acceptable (I
> would say), just less nice: what you set there will stay around even
> after the import finished and nobody needs that.
I will try it without grabBag.
I'm confident about the needed calculations themselves in the meantime.
At least my manually calculations in a spreadsheet show the correct
position and size now for the shapes in case of nested groups too. But
it will take me a while to translate the principle solution into code.
Kind regards
Regina
More information about the LibreOffice
mailing list