Markup command vereinfachen - gelöst

Begonnen von Manuela, Freitag, 21. Juni 2019, 13:00

« vorheriges - nächstes »

Manuela

Hallo,

mein Scheme rostet mit erstaunlicher Schnelligkeit immer wieder ein  ;)

Ich möchte ein kammartiges Gebilde zeichnen, wobei die Höhe und Breite der Kämme variable sein soll. \scale hat den Nachteil, dass die Striche in x- und y-Richtung unterschiedlich dick werden, sonst hätte ich mir die Funktion sparen können.

Der folgende Code funktioniert, es geht doch sicherlich viel einfacher, aber wie?

#(define-markup-command (kamm layout props hoch hor)(number? number?)
   (let ((hor2 (* hor 2))
         (hor3 (* hor 3)))
     (interpret-markup
      layout
      props
      #{
        \markup
        \path #0.25 #`((moveto 0 0)
                       (lineto 0 ,hoch)
                       (lineto ,hor ,hoch)
                       (lineto ,hor 0)
                       (moveto ,hor ,hoch)
                       (lineto ,hor2 ,hoch)
                       (lineto ,hor2 0)
                       (moveto ,hor2 ,hoch)
                       (lineto ,hor3 ,hoch)
                       (lineto ,hor3 0))
      #})))
\markup \kamm #10  #4
Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

Hallo Manuela,

schau mal ob folgendes Deinen Wünschen nahe kommt. Zahlreiche Kommentare ;)


#(define-markup-command (kamm layout props height width)(number? number?)
#:properties ((thickness 0.25)
              (amount 4) ;; wieviele Zacken sollen es werden
             )
"HEIGHT ist die senkrechte Höhe des Kamms.  WIDTH ist die horizontale Breite des
gesamten Kamms.
Die Anzahl der Zacken kann mit einem override für AMOUNT eingestellt werden.

Anmerkung: AMOUNT könnte natürlich auch statt eines properties als ein drittes
Argument des markup-commands programmiert werden.  Umgekehrt kann man auch
überlegen HEIGHT und/oder WIDTH zu properties zu machen, kommt auf die konkrete
Anwendung an ..."
  (let* (;; Abstand zwischen den Zacken
         (single-width (/ width amount))
         ;; Der erste senkrecht Strich-stencil
         (one (make-line-stencil thickness 0 0 0 height))
         ;; Erstelle eine Liste weiterer Zacken-stencils der Form: Ꞁ
         (other
           (map
             (lambda (i)
               (ly:stencil-translate
                 (make-connected-path-stencil
                   `((0  0) (,single-width  0) (,single-width ,(- height)))
                   thickness 1 1 #f #f)
                 (cons (* i single-width) height)))
             (iota (1- amount)))))
    ;; Füge die stencils zusammen:
    (apply ly:stencil-add one other)))
   
   
\markup
  \column {
    \kamm #5 #4
    \kamm #2 #4
    \kamm #2 #8
    \override #'(thickness . 0.1) \kamm #2 #8
    \override #'(amount . 20) \override #'(thickness . 0.1) \kamm #2 #8
  }


HTH,
  Harm

Manuela

Danke Harm, so ist es viel eleganter.
Danke für eure Hilfe
viele Grüße
-- Manuela