cardoza2
cardoza2

Reputation: 185

RecipesBase: How to create a recipe for two arrays of structs

I have two different arrays of structs that I'd like to build a recipe for: typeof(nodes) == Array{Node{TF}, 1} and typeof(elements) == Array{Element{TF}, 1} (where TF is commonly a Float64). I'd love to be able to do something like plot(nodes, elements) and get back a plot object without adding Plots to my package, I'd prefer the lighter weight RecipesBase.

I've read the documentation, the overview, and this discussion on using RecipesBase.

I was able to get a user recipe working by creating a placeholder struct NodeMesh that simply holds the arrays nodes and elements. The function signature of the recipe looks like: @recipe function plot_mesh(nodemesh::NodeMesh). (And then I promptly unpack the struct inside of the recipe.)

This approach seems ...wrong? I mean it works, but I also could just define a function that returns a dictionary that I pass to Plots. It seems like the series recipe is the correct solution, but I can't get it to work. I've tried a couple of different variations of the function signature (all of which didn't work):

@recipe function f(::Type{Val{:gxmesh}}, nodes, elements)
@recipe function plot_mesh(nodes::Vector{Node}, elements::Vector{MeshElement}) 
@recipe function plot_mesh(nodes::Array{Node}, elements::Array{MeshElement}) 

What's the correct approach here? What am I missing?

Upvotes: 0

Views: 42

Answers (1)

cardoza2
cardoza2

Reputation: 185

I found a potential answer in the issues of RecipeBase.

Here's how I changed the function signature that worked:

@recipe function plot_mesh_recipe(nodes::Array{T1, 1}, elements::Array{T2, 1}) where {T1<:Node, T2<:MeshElement}

That function returns the x and y of the things I want to plot.

Upvotes: 0

Related Questions