On 11 sept. 2012, at 22:29, Marc Hohl <[email protected]> wrote:
>>>
>> Are you certain that every vertical axis group will always contain the same
>> number of bar lines? If not, it's possible that the matrix you're talking
>> about may not have complete rows, in which case it's difficult to know how
>> to break it.
> I am not 100% sure – there could be corner cases where a staff line stops
> before the
> volta bracket is closed, but this could lead to an error when compiling the
> .ly file.
What about pieces with different simultaneous time signatures? They'd have
different numbers of bars for a given section.
>>
>> One way to check it is to look at the left or right of the
>> spanned_rank_interval of the grobs (the values will be the same as you're
>> dealing with items which only ever "span" one column). Once it goes
>> backwards, you know that you've skipped to the next row.
> What kind of values does spanned_rank_interval return?
>
The column number of a grob's left and right bound. Columns are linearly
ordered from the beginning of a score to the end, so you can use it to know
when a new staff is beginning in your array. For bar lines, the grob only
spans one column so the left and right values of the returned will be the same
- you can use either one.
In C++, if I had a vector <Grob *> foo that I wanted to sort into vector
<vector <Grob *> > bar, if I understand you correctly, I'd do:
int current_column = INT_MAX;
for (vsize i = 0; i < foo.size (); i++)
{
int column = foo[i]->spanned_rank_interval ()[LEFT];
if (column <= current_column)
bar.push_back (vector<Grob *> ());
bar.back ().push_back (foo[i]);
current_column = column;
}
The same thing is doable in Scheme - I just write pseudo-code faster in C++.
Cheers,
MS
_______________________________________________
lilypond-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-devel