Makie.jl 场景中的多个网格图来自一个函数
Multiple mesh plots in Makie.jl scene from within a function
如何在 Makie 中的一个函数内绘制两个网格?
在 REPL 中,我可以执行以下操作并获得包含两个立方体的图:
using Makie
A = FRect3D(Vec3f0(0), Vec3f0(1))
B = FRect3D(Vec3f0(1), Vec3f0(1))
s = Scene()
mesh(A, color = :red)
mesh!(B, color = :blue)
但是,在函数调用中我似乎无法让它工作:
我的尝试:
using Makie
function draw_cubes()
A = FRect3D(Vec3f0(0), Vec3f0(1))
B = FRect3D(Vec3f0(1), Vec3f0(1))
mesh(A, color = :red)
mesh!(B, color = :blue)
end
s=Scene()
draw_cubes()
让我一片空白,returns
Combined{AbstractPlotting.mesh,Tuple{GeometryBasics.Mesh{3,Float32,GeometryBasics.Ngon{3,Float32,3,GeometryBasics.PointMeta{3,Float32,Point{3,Float32},(:uv, :normals),Tuple{Vec{2,Float32},Vec{3,Float32}}}},GeometryBasics.FaceView{GeometryBasics.Ngon{3,Float32,3,GeometryBasics.PointMeta{3,Float32,Point{3,Float32},(:uv, :normals),Tuple{Vec{2,Float32},Vec{3,Float32}}}},GeometryBasics.PointMeta{3,Float32,Point{3,Float32},(:uv, :normals),Tuple{Vec{2,Float32},Vec{3,Float32}}},GeometryBasics.NgonFace{3,GeometryBasics.OffsetInteger{-1,UInt32}},StructArrays.StructArray{GeometryBasics.PointMeta{3,Float32,Point{3,Float32},(:uv, :normals),Tuple{Vec{2,Float32},Vec{3,Float32}}},1,NamedTuple{(:position, :uv, :normals),Tuple{Array{Point{3,Float32},1},Array{Vec{2,Float32},1},Array{Vec{3,Float32},1}}},Int64},Array{GeometryBasics.NgonFace{3,GeometryBasics.OffsetInteger{-1,UInt32}},1}}}}}
注释掉 mesh!
行成功地绘制了第一个立方体。我只是无法获得第二个。
我也试过将场景传递给函数,在函数中声明场景(或使用 global s
),但没有成功。
非 Makie 解决方案(只要它们是交互式图)也可以作为答案......但我想弄清楚我哪里出错了。
(我使用的是 Julia 版本 1.5.3 (2020-11-09);Makie v0.12.0)
将场景作为参数传递给函数似乎可行,实际上......当我使用 mesh
作为第一次调用时它不起作用(给出一堆 Warning: No strict ticks found
和一个 ERROR: MethodError: no method matching _default(::Observable{Scene}, ::GLMakie.GLAbstraction.Style{:default}, ::Dict{Symbol,Any})
)
然而,
function draw_cube_scene(s::Scene)
A = FRect3D(Vec3f0(0), Vec3f0(1))
B = FRect3D(Vec3f0(1), Vec3f0(1))
mesh!(s, A, color = :red)
mesh!(s, B, color = :blue)
s
end
似乎有效。
如何在 Makie 中的一个函数内绘制两个网格?
在 REPL 中,我可以执行以下操作并获得包含两个立方体的图:
using Makie
A = FRect3D(Vec3f0(0), Vec3f0(1))
B = FRect3D(Vec3f0(1), Vec3f0(1))
s = Scene()
mesh(A, color = :red)
mesh!(B, color = :blue)
但是,在函数调用中我似乎无法让它工作:
我的尝试:
using Makie
function draw_cubes()
A = FRect3D(Vec3f0(0), Vec3f0(1))
B = FRect3D(Vec3f0(1), Vec3f0(1))
mesh(A, color = :red)
mesh!(B, color = :blue)
end
s=Scene()
draw_cubes()
让我一片空白,returns
Combined{AbstractPlotting.mesh,Tuple{GeometryBasics.Mesh{3,Float32,GeometryBasics.Ngon{3,Float32,3,GeometryBasics.PointMeta{3,Float32,Point{3,Float32},(:uv, :normals),Tuple{Vec{2,Float32},Vec{3,Float32}}}},GeometryBasics.FaceView{GeometryBasics.Ngon{3,Float32,3,GeometryBasics.PointMeta{3,Float32,Point{3,Float32},(:uv, :normals),Tuple{Vec{2,Float32},Vec{3,Float32}}}},GeometryBasics.PointMeta{3,Float32,Point{3,Float32},(:uv, :normals),Tuple{Vec{2,Float32},Vec{3,Float32}}},GeometryBasics.NgonFace{3,GeometryBasics.OffsetInteger{-1,UInt32}},StructArrays.StructArray{GeometryBasics.PointMeta{3,Float32,Point{3,Float32},(:uv, :normals),Tuple{Vec{2,Float32},Vec{3,Float32}}},1,NamedTuple{(:position, :uv, :normals),Tuple{Array{Point{3,Float32},1},Array{Vec{2,Float32},1},Array{Vec{3,Float32},1}}},Int64},Array{GeometryBasics.NgonFace{3,GeometryBasics.OffsetInteger{-1,UInt32}},1}}}}}
注释掉 mesh!
行成功地绘制了第一个立方体。我只是无法获得第二个。
我也试过将场景传递给函数,在函数中声明场景(或使用 global s
),但没有成功。
非 Makie 解决方案(只要它们是交互式图)也可以作为答案......但我想弄清楚我哪里出错了。
(我使用的是 Julia 版本 1.5.3 (2020-11-09);Makie v0.12.0)
将场景作为参数传递给函数似乎可行,实际上......当我使用 mesh
作为第一次调用时它不起作用(给出一堆 Warning: No strict ticks found
和一个 ERROR: MethodError: no method matching _default(::Observable{Scene}, ::GLMakie.GLAbstraction.Style{:default}, ::Dict{Symbol,Any})
)
然而,
function draw_cube_scene(s::Scene)
A = FRect3D(Vec3f0(0), Vec3f0(1))
B = FRect3D(Vec3f0(1), Vec3f0(1))
mesh!(s, A, color = :red)
mesh!(s, B, color = :blue)
s
end
似乎有效。