Hi Andrew,
On Fri, Aug 21, 2015 at 6:51 PM, Andrew Bernard <[email protected]>
wrote:
> Can anybody kindly point me to code examples showing how to find the
> distance of a grob to its nearest enclosing barlines, in Scheme?
>
I don't know of any examples out there, be this will do it.
This uses the horizontal coordinate of the grob and barline as a simple
demonstration. Depending on what precisely you mean by "distance" (right
edge to left edge, left edge to right edge, etc.) you may want to use
ly:grob-extent.
HTH,
David
%%%%%%%%%%%%%%
\version "2.19.23"
#(define (distance-to-nearest-barline dir)
(lambda (grob)
(let* ((refp (ly:grob-system grob))
(all-elts (ly:grob-array->list (ly:grob-object refp
'all-elements)))
(barlines (filter (lambda (elt)
(grob::has-interface elt
'bar-line-interface))
all-elts))
(me-pos (grob::rhythmic-location grob))
(pred? (if (= LEFT dir) rhythmic-location>=?
rhythmic-location<?))
(closest (filter (lambda (b)
(pred? me-pos (grob::rhythmic-location b)))
barlines))
(closest (reduce
(lambda (elem prev)
(if (pred?
(grob::rhythmic-location prev)
(grob::rhythmic-location elem))
prev
elem))
#f
closest)))
(if closest
(let* ((me-X (ly:grob-relative-coordinate grob refp X))
(closest-X (ly:grob-relative-coordinate closest refp X))
(dist (- closest-X me-X)))
(ly:grob-set-property! grob 'color darkgreen) ; for testing
(ly:grob-set-property! closest 'color red) ; for testing
(format #t "distance between ~a and ~a: ~a~%"
grob closest dist))
(ly:message "No closest barline!")))))
{
c'4 d' e'
\once \override NoteHead.after-line-breaking =
#(distance-to-nearest-barline RIGHT)
f'
d'1
c'4 d' e'
\once \override Stem.after-line-breaking = #(distance-to-nearest-barline
LEFT)
f'
d'1
}
_______________________________________________
lilypond-user mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user