Thanks. I will work through the example. It seems it isn't possible to embed 
more than one item within a group and one group per grob is the only approach 
for the time being. If this is the case then why use groups rather than adding 
the attributes to the grob itself?


James



________________________________
From: David Nalesnik <david.nales...@gmail.com>
Sent: 10 January 2018 15:21
To: James Opstad
Cc: lilypond-user@gnu.org
Subject: Re: SVG output - Group multiple grobs together

Hi James,

On Wed, Jan 10, 2018 at 5:51 AM, James Opstad <jamesops...@hotmail.com> wrote:
> Hello,
>
>
> I have been experimenting with the new output-attributes grob property for
> SVG output. For example, the following code creates a group with id="noteC"
> around the C notehead.
>
>
> \version "2.19.80"
> \pointAndClickOff
> \relative c' {
>   \once \override NoteHead.output-attributes = #'((id . noteC))
>   c4 d e f |
> }
>
> How would I include multiple grobs within the same group e.g. all the grobs
> associated with a single note (NoteHead, Stem, Accidental etc.)?
>

All grobs have pointers to other single grobs or arrays of other
grobs.  You gain access to these through such functions as
ly:grob-parent, ly:grob-object, ly:grob-array, ly:item-get-column.
The idea of "multiple grobs within the same group e.g. all the grobs
associated with a single note" can prove to be complex since your idea
of a grouping is not necesarily LilyPond's.  You may have to follow
chains of pointers--as I did below to arrive at the Stem grob from
NoteHead: i.e, through NoteColumn, the Y-parent of the NoteHead.

So here is something quickly hacked together from your code example:

\version "2.19.65"

\pointAndClickOff
\relative c' {
  \once \override NoteHead.output-attributes =
  #(lambda (grob)
     (let* ((acc (ly:grob-object grob 'accidental-grob))
            (acc-name (if (ly:grob? acc) (grob::name acc) "none"))
            ; we need a NoteColumn object for access to other grobs
            (nc (ly:grob-parent grob Y))
            (stem (ly:grob-object nc 'stem))
            (stem-name (if (ly:grob? stem) (grob::name stem) "none"))
            (pc (ly:item-get-column grob))
            (pc-name (if (ly:grob? pc) (grob::name pc) "none"))
            (elts (ly:grob-object pc 'elements)))
       (display elts) ; just so you see a grob array
       (list
        (cons 'id 'noteC)
        (cons 'accidental acc-name)
        (cons 'stem stem-name)
        (cons 'column pc-name))))

  c4 d e f |
}

%%%

Here is a link to something you might find useful.  It stores data
about every grob encountered.

https://www.mail-archive.com/lilypond-user@gnu.org/msg117645.html

HTH,

David
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to