Построение векторного шрифта-рецепта в Юлии
Есть ли способ написать рецепт печатного типа для типа
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
На данный момент векторная версия, как написано выше, не будет делать то, что я хочу. Я, наверное, могу как-то его изменить, но похоже, что должен быть «правильный» способ сделать это.