-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmathbox.jl
84 lines (72 loc) · 2.64 KB
/
mathbox.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
module Mathbox
export bar3d, vec3d, surf
using JSON
using Patchwork
include("patchworkpatch.jl")
const mbjsdir = joinpath(dirname(Base.source_path()), "js")
const mbjs = joinpath(mbjsdir, "mathbox-bundle.js") |> readstring
const mbjlinitjs = joinpath(mbjsdir, "mbjlinit.js") |> readstring
__init__() = begin
try
Patchwork.load_js_runtime()
display("text/html", script_elem(mbjs, mbjlinitjs))
catch e
error(e)
end
end
script_elem(jsstrs...) =
Elem(:script, join(jsstrs,";\n")) & Dict(:type=>"text/javascript", :charset=>"utf-8")
plotdefaults = Dict(:height=>"500px", :wigglefactor=>0.0)
"""
Returns a div and a script which sets up a scene in the div with axes and a grid
"""
scene_setup_elem(divid, fulldivid, params) = begin
divsetupjs = """
var divid = "$divid"
var fulldivid = "$fulldivid"
"""
scene_setupjs = joinpath(mbjsdir, "mbscene_axes_setup.js") |> readstring
[Elem(:div; id=fulldivid, style=Dict(:height=>params[:height])),
script_elem(divsetupjs, scene_setupjs)]
end
scene_from_template{T<: Real}(
data_matrices::Vector{Matrix{T}}, template::AbstractString;
divid=randstring(12), params=plotdefaults, reinit_scene=false) = begin
params = merge(plotdefaults, params)
divid = string(divid)
data_assignments = ""
for (i,data) in enumerate(data_matrices)
tdata = data'
nrows, ncols = size(tdata)
data_assignments *= """
var data$i = $(tdata |> vec |> json)
var drows$i = $nrows
var dcols$i = $ncols
"""
end
template_jsstr = joinpath(mbjsdir, template) |> readstring
fulldivid = "mathbox-div-"*divid
pwelems = scene_setup_elem(divid, fulldivid, params)
variable_assignments = """
$data_assignments
var divid = "$divid"
var mathbox = mbinstances[divid]
var view = mbinstances["view"+divid]
mbjlparams[divid] = $(params |> json)
"""
script_contents = """
(function mbdiv$divid(){
$variable_assignments
$template_jsstr
})()
"""
push!(pwelems, script_elem(script_contents))
Elem(:div, pwelems)
end
bar3d{T <: Real}(data::Matrix{T}; divid=randstring(12), params=plotdefaults, reinit_scene=false) =
scene_from_template(Matrix{T}[data], "mbbar3d_template.js"; divid=divid, params=params, reinit_scene=reinit_scene)
vec3d{T <: Real}(data::Matrix{T}; bases=zeros(data), divid=randstring(12), params=plotdefaults, reinit_scene=false) =
scene_from_template(Matrix{T}[data, bases], "mbvec3d_template.js"; divid=divid, params=params, reinit_scene=reinit_scene)
surf{T<: Real}(data::Matrix{T}; divid=randstring(12), params=plotdefaults, reinit_scene=false) =
scene_from_template(Matrix{T}[data], "mbsurf_template.js"; divid=divid, params=params, reinit_scene=reinit_scene)
end