Visualization
As mentioned in other sections of this documentation, the Makie backend can be used in order to generate 2D/3D renderings of optical systems and results generated with this package. Refer to the extensive Makie
documentation and the Examples and the Tutorials sections of this package for a variety of showcases on how to visualize your simulation.
Rendering elements
The main function provided for visualization purposes is the render!
function.
BeamletOptics.render!
— Methodrender!(axis, thing; kwargs...)
The render!
function allows for the visualization of optical system and beams under the condition that a suitable backend is loaded. This means that either one of the following packages must be loaded in combination with BeamletOptics
via using
:
- GLMakie
- preferred for 3D viewing
- use
LScene
orAxis3
environments
- CairoMakie
- preferred for the generation of high-quality .pngs
- only
Axis3
is supported
If no suitable backend is loaded, a MissingBackendError
will be thrown.
Implementations reqs.
All concrete implementations of render!
must adhere to the following minimal interface:
render!(axis, thing; kwargs...)
axis
: an axis type of the union ofLScene
orAxis3
thing
: an abstract or concrete object or beam typekwargs
: custom orMakie
keyword arguments that are passed to the underlying backend
Refer to the BeamletOptics
extension docs for Makie
for more information.
If a suitable backend is loaded, additional dispatched render!
functions will become available. For instance, this allows the plotting of a GaussianBeamlet
.
Loading the extension
Refer to the following snippet for an example on how the extension loading behaves. When only BMO is loaded, the render!
function becomes available but will throw an BeamletOptics.MissingBackendError
when trying to plot something.
julia> using BeamletOptics
julia> methods(render!)
# 1 method for generic function "render!" from BeamletOptics:
[1] render!(::Any, ::Union{BeamletOptics.AbstractSystem, BeamletOptics.AbstractBeam, BeamletOptics.AbstractObject, BeamletOptics.AbstractObjectGroup, BeamletOptics.AbstractRay, BeamletOptics.AbstractShape}, kwargs...)
@ C:\Users\anon\.julia\dev\BeamletOptics\src\Render.jl:56
julia> axis = nothing;
julia> mirror = RoundPlanoMirror(25e-3, 5e-3);
julia> render!(axis, mirror)
ERROR: It appears no suitable Makie backend is loaded in this session.
Stacktrace:
[1] render!(::Nothing, ::RoundPlanoMirror{Float64})
@ BeamletOptics c:\Users\anon\.julia\dev\BeamletOptics\src\Render.jl:46
[2] top-level scope
@ REPL[5]:1
Once a backend has been loaded, additional dispatched versions of render!
become available.
julia> using GLMakie
julia> methods(render!)
# 21 methods for generic function "render!" from BeamletOptics:
[1] render!(ax::Union{Axis3, LScene}, s::BeamletOptics.UnionSDF; kwargs...)
@ BeamletOpticsMakieExt C:\Users\anon\.julia\dev\BeamletOptics\ext\RenderSDF.jl:32
[2] render!(axis::Union{Axis3, LScene}, css::BeamletOptics.ConcaveSphericalSurfaceSDF; color, kwargs...)
@ BeamletOpticsMakieExt C:\Users\anon\.julia\dev\BeamletOptics\ext\RenderLenses.jl:1
[3] render!(axis::Union{Axis3, LScene}, css::BeamletOptics.ConvexSphericalSurfaceSDF; color, kwargs...)
@ BeamletOpticsMakieExt C:\Users\anon\.julia\dev\BeamletOptics\ext\RenderLenses.jl:31
[4] render!(axis::Union{Axis3, LScene}, acyl::BeamletOptics.AbstractAcylindricalSurfaceSDF; color, kwargs...)
@ BeamletOpticsMakieExt C:\Users\anon\.julia\dev\BeamletOptics\ext\RenderCylinderLenses.jl:1
[5] etc...