Mercurial > repos > public > sbplib_julia
changeset 1628:9cd2b8f81175 feature/grids/plotting
Add package extensions for Makie for plotting grids and gridfunctions
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Fri, 26 Apr 2024 22:19:30 +0200 |
parents | 857dab1a3116 |
children | 2fab141e4a9a |
files | Project.toml ext/SbplibMakieExt.jl |
diffstat | 2 files changed, 77 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/Project.toml Mon Jun 24 13:54:33 2024 +0200 +++ b/Project.toml Fri Apr 26 22:19:30 2024 +0200 @@ -8,5 +8,11 @@ TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" TiledIteration = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" +[weakdeps] +Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + +[extensions] +SbplibMakieExt = "Makie" + [compat] julia = "1.5"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ext/SbplibMakieExt.jl Fri Apr 26 22:19:30 2024 +0200 @@ -0,0 +1,71 @@ +module SbplibMakieExt + +using Sbplib.Grids +using Makie + + +function verticies_and_faces_and_values(g::Grid{<:Any,2}, gf::AbstractArray{<:Any, 2}) + ps = map(Tuple, g)[:] + values = gf[:] + + N = length(ps) + + faces = Vector{NTuple{3,Int}}() + + n,m = size(g) + Li = LinearIndices((1:n, 1:m)) + for i ∈ 1:n-1, j = 1:m-1 + + # Add point in the middle of the patch to preserve symmetries + push!(ps, Tuple((g[i,j] + g[i+1,j] + g[i+1,j+1] + g[i,j+1])/4)) + push!(values, (gf[i,j] + gf[i+1,j] + gf[i+1,j+1] + gf[i,j+1])/4) + + push!(faces, (Li[i,j], Li[i+1,j], length(ps))) + push!(faces, (Li[i+1,j], Li[i+1,j+1], length(ps))) + push!(faces, (Li[i+1,j+1], Li[i,j+1], length(ps))) + push!(faces, (Li[i,j+1], Li[i,j], length(ps))) + end + + verticies = permutedims(reinterpret(reshape,eltype(eltype(ps)), ps)) + faces = permutedims(reinterpret(reshape,Int, faces)) + + return verticies, faces, values +end + + +function make_plot(g,gf) + v,f,c = verticies_and_faces_and_values(g,gf) + mesh(v,f,color=c, + shading = NoShading, + ) +end + +# scatter(collect(g)[:]) + +function Makie.surface(g::Grid{<:Any,2}, gf::AbstractArray{<:Any, 2}; kwargs...) + surface(getindex.(g,1), getindex.(g,2), gf; + shading = NoShading, + kwargs..., + ) +end + +function Makie.mesh(g::Grid{<:Any,2}, gf::AbstractArray{<:Any, 2}; kwargs...) + v,f,c = verticies_and_faces_and_values(g, gf) + mesh(v,f,color=c, + shading = NoShading, + kwargs..., + ) +end + +function Makie.plot!(plot::Plot(Grid{<:Any,2},AbstractArray{<:Any, 2})) + # TODO: How to handle kwargs? + # v,f,c = verticies_and_faces_and_values(plot[1], plot[2]) + r = @lift verticies_and_faces_and_values($(plot[1]), $(plot[2])) + v,f,c = (@lift $r[1]), (@lift $r[2]), (@lift $r[3]) + mesh!(plot, v, f, color=c, + shading = NoShading, + ) +end + +Makie.convert_arguments(::Type{<:Scatter}, g::Grid) = (map(Tuple,collect(g)[:]),) +end