Построение векторного шрифта-рецепта в Юлии

Есть ли способ написать рецепт печатного типа для типа T а затем пусть Джулия каким-то образом выведет соответствующий рецепт для типа Vector{T}?

Простой пример. Предположим, у меня есть блочная структура, и я пишу простой рецепт типа для ее построения:

      using Plots

struct B x0;x1;y0;y1 end
bshape(b::B) = Shape([b.x0,b.x1,b.x1,b.x0],[b.y0,b.y0,b.y1,b.y1])
@recipe f(::Type{B}, b::B) = bshape(b)

А сейчас plot(B(0,1,2,3))рисует заполненный прямоугольник, как я хотел. Теперь предположим, что у меня есть массив s, и я хочу построить все прямоугольники на одном графике, вызвав plot(bs). Простое определение рецепта типа для этого не решает. Я могу написать рецепт другого типа для векторов B так:

      @recipe f(::Type{Vector{B}}, bs::Vector{B}) = bshape.(bs)

Но, во-первых, мне это не очень нравится, в нем есть повторяющийся код. Я бы предпочел посоветовать Джулии использовать рецепт оригинального шрифта. Кроме того, например, если я хочу, чтобы каждое поле могло определять другие параметры построения графика, скажем:

      @recipe function f(::Type{B}, b::B)
    fillcolor --> (b.x0==0 ? :red : :blue)
    bshape(b)
end

На данный момент векторная версия, как написано выше, не будет делать то, что я хочу. Я, наверное, могу как-то его изменить, но похоже, что должен быть «правильный» способ сделать это.

0 ответов

Другие вопросы по тегам