Using two separate functions to savescript() and execall()

This commit is contained in:
Giorgio Calderone 2020-03-18 17:12:05 +01:00
parent 7ef300c11b
commit 06574ea26f
2 changed files with 107 additions and 78 deletions

View File

@ -40,7 +40,7 @@ using Gnuplot
A slightly more complicated one showing a parabola with a solid line and a legend: A slightly more complicated one showing a parabola with a solid line and a legend:
``` Julia ``` Julia
x = 1:10 x = 1:100
@gp x x.^2 "w l tit 'Parabola'" @gp x x.^2 "w l tit 'Parabola'"
``` ```
@ -71,10 +71,10 @@ julia> @gp("set key horizontal", "set grid", title="My title",
x, y, "w l t 'Real model' dt 2 lw 2 lc rgb 'red'", x, y, "w l t 'Real model' dt 2 lw 2 lc rgb 'red'",
x, y+noise, e, "w errorbars t 'Data'") x, y+noise, e, "w errorbars t 'Data'")
GNUPLOT (default) print GPVAL_TERM GNUPLOT (default) print GPVAL_TERM
GNUPLOT (default) -> qt GNUPLOT (default) -> wxt
GNUPLOT (default) print GPVAL_TERMOPTIONS GNUPLOT (default) print GPVAL_TERMOPTIONS
GNUPLOT (default) -> 0 font "Sans,9" GNUPLOT (default) -> 0 enhanced
GNUPLOT (default) set term qt 0 font "Sans,9" title 'Gnuplot.jl: default' GNUPLOT (default) set term wxt 0 enhanced title 'Gnuplot.jl: default'
GNUPLOT (default) reset session GNUPLOT (default) reset session
GNUPLOT (default) set key horizontal GNUPLOT (default) set key horizontal
GNUPLOT (default) set grid GNUPLOT (default) set grid
@ -90,13 +90,12 @@ GNUPLOT (default) -5.90238619765355 0.9548956415530343
GNUPLOT (default) ... GNUPLOT (default) ...
GNUPLOT (default) EOD GNUPLOT (default) EOD
GNUPLOT (default) $data1 << EOD GNUPLOT (default) $data1 << EOD
GNUPLOT (default) -6.283185307179586 1.9916843919829947 0.5 GNUPLOT (default) -6.283185307179586 2.4842815808516905 0.5
GNUPLOT (default) -6.156252270670907 0.33627277530403243 0.5 GNUPLOT (default) -6.156252270670907 1.2062036112716572 0.5
GNUPLOT (default) -6.029319234162229 0.2532754844189571 0.5 GNUPLOT (default) -6.029319234162229 1.206937328889227 0.5
GNUPLOT (default) -5.90238619765355 1.083699870620209 0.5 GNUPLOT (default) -5.90238619765355 0.23435472973538996 0.5
GNUPLOT (default) ... GNUPLOT (default) ...
GNUPLOT (default) EOD GNUPLOT (default) EOD
GNUPLOT (default) reset
GNUPLOT (default) set key horizontal GNUPLOT (default) set key horizontal
GNUPLOT (default) set grid GNUPLOT (default) set grid
GNUPLOT (default) set title "My title" GNUPLOT (default) set title "My title"
@ -117,7 +116,7 @@ Note the different color in the reply (if your terminal is able to display color
So far we have shown how to produce plots with a single command, however such task can also be performed using multiple statements. The syntax is exactly the same, but we should use the `:-` symbol at the beginning of each statement (except the first) and at the end of each statement (except the last), e.g.: So far we have shown how to produce plots with a single command, however such task can also be performed using multiple statements. The syntax is exactly the same, but we should use the `:-` symbol at the beginning of each statement (except the first) and at the end of each statement (except the last), e.g.:
``` Julia ``` Julia
# Reset the gnuplot session and give the dataset the name `MyDataSet1` # Reset the gnuplot session and use a dataset named `MyDataSet1`
name = "\$MyDataSet1" name = "\$MyDataSet1"
@gp x y+noise e name :- @gp x y+noise e name :-
@ -139,7 +138,7 @@ name = "\$MyDataSet1"
As discussed above, **Gnuplot.jl** allows to trasparently exploit all gnuplot functionalities. E.g., we can show a random image with: As discussed above, **Gnuplot.jl** allows to trasparently exploit all gnuplot functionalities. E.g., we can show a random image with:
```Julia ```Julia
@gp randn(Float64, 30, 50) "w image" @gp 1:30 2:50 randn(Float64, 30, 50) "w image"
``` ```
or show an interactive 3D plots using the `@gsp` macro in place of `@gp`, e.g.: or show an interactive 3D plots using the `@gsp` macro in place of `@gp`, e.g.:

View File

@ -4,7 +4,7 @@ using StructC14N, ColorTypes, Printf, StatsBase, ReusePatterns, DataFrames
using ColorSchemes using ColorSchemes
import Base.reset import Base.reset
import Base.println import Base.write
import Base.iterate import Base.iterate
import Base.convert import Base.convert
import Base.string import Base.string
@ -380,23 +380,23 @@ end
# ╭───────────────────────────────────────────────────────────────────╮ # ╭───────────────────────────────────────────────────────────────────╮
# │ println() and writeread() # │ write() and writeread()
# ╰───────────────────────────────────────────────────────────────────╯ # ╰───────────────────────────────────────────────────────────────────╯
# --------------------------------------------------------------------- # ---------------------------------------------------------------------
""" """
# println # write
Send a string to gnuplot's STDIN. Send a string to gnuplot's STDIN.
The commands sent through `println` are not stored in the current The commands sent through `write` are not stored in the current
session (use `newcmd` to save commands in the current session). session (use `newcmd` to save commands in the current session).
## Arguments: ## Arguments:
- `gp`: a `DrySession` object; - `gp`: a `DrySession` object;
- `str::String`: command to be sent; - `str::String`: command to be sent;
""" """
println(gp::DrySession, str::AbstractString) = nothing write(gp::DrySession, str::AbstractString) = nothing
function println(gp::GPSession, str::AbstractString) function write(gp::GPSession, str::AbstractString)
global options global options
if options.verbose if options.verbose
printstyled(color=:light_yellow, "GNUPLOT ($(gp.sid)) $str\n") printstyled(color=:light_yellow, "GNUPLOT ($(gp.sid)) $str\n")
@ -408,8 +408,8 @@ function println(gp::GPSession, str::AbstractString)
end end
println(gp::DrySession, d::DataSet) = nothing write(gp::DrySession, d::DataSet) = nothing
function println(gp::GPSession, d::DataSet) function write(gp::GPSession, d::DataSet)
if options.verbose if options.verbose
v = "" v = ""
printstyled(color=:light_black, "GNUPLOT ($(gp.sid)) $(d.name) << EOD\n") printstyled(color=:light_black, "GNUPLOT ($(gp.sid)) $(d.name) << EOD\n")
@ -437,13 +437,13 @@ function writeread(gp::GPSession, str::AbstractString)
verbose = options.verbose verbose = options.verbose
options.verbose = false options.verbose = false
println(gp, "print 'GNUPLOT_CAPTURE_BEGIN'") write(gp, "print 'GNUPLOT_CAPTURE_BEGIN'")
options.verbose = verbose options.verbose = verbose
println(gp, str) write(gp, str)
options.verbose = false options.verbose = false
println(gp, "print 'GNUPLOT_CAPTURE_END'") write(gp, "print 'GNUPLOT_CAPTURE_END'")
options.verbose = verbose options.verbose = verbose
out = Vector{String}() out = Vector{String}()
@ -464,7 +464,7 @@ function reset(gp::DrySession)
gp.datas = Vector{DataSet}() gp.datas = Vector{DataSet}()
gp.plots = [SinglePlot()] gp.plots = [SinglePlot()]
gp.curmid = 1 gp.curmid = 1
println(gp, "reset session") exec(gp, "reset session")
return nothing return nothing
end end
@ -485,7 +485,7 @@ function newdataset(gp::DrySession, accum::Vector{String}; name="")
name = "\$$name" name = "\$$name"
d = DataSet(name, accum) d = DataSet(name, accum)
push!(gp.datas, d) push!(gp.datas, d)
println(gp, d) # Send now to gnuplot process write(gp, d) # Send now to gnuplot process
return name return name
end end
newdataset(gp::DrySession, args...; name="") = newdataset(gp, data2string(args...), name=name) newdataset(gp::DrySession, args...; name="") = newdataset(gp, data2string(args...), name=name)
@ -533,20 +533,47 @@ end
# ╭───────────────────────────────────────────────────────────────────╮ # ╭───────────────────────────────────────────────────────────────────╮
# │ dump() and driver() # │ execall(), dump() and driver()
# ╰───────────────────────────────────────────────────────────────────╯ # ╰───────────────────────────────────────────────────────────────────╯
# --------------------------------------------------------------------- # ---------------------------------------------------------------------
dump(gp::DrySession; kw...) = dump(gp, gp; kw...) execall(gp::DrySession; term::AbstractString="", output::AbstractString="") = nothing
function dump(gp::DrySession, stream; all=false, term::AbstractString="", output::AbstractString="") function execall(gp::GPSession; term::AbstractString="", output::AbstractString="")
all && println(stream, "reset session")
if term != "" if term != ""
former_term = writeread(gp, "print GPVAL_TERM")[1] former_term = writeread(gp, "print GPVAL_TERM")[1]
former_opts = writeread(gp, "print GPVAL_TERMOPTIONS")[1] former_opts = writeread(gp, "print GPVAL_TERMOPTIONS")[1]
exec(gp, "set term $term")
end
(output != "") && exec(gp, "set output '$output'")
for i in 1:length(gp.plots)
d = gp.plots[i]
for j in 1:length(d.cmds)
exec(gp, d.cmds[j])
end
if length(d.elems) > 0
s = (d.flag3d ? "splot " : "plot ") * " \\\n " *
join(d.elems, ", \\\n ")
exec(gp, s)
end
end
(length(gp.plots) > 1) && exec(gp, "unset multiplot")
(output != "") && exec(gp, "set output")
if term != ""
exec(gp, "set term $former_term $former_opts")
end
return nothing
end
function savescript(gp::DrySession, filename; term::AbstractString="", output::AbstractString="")
stream = open(filename, "w")
println(stream, "reset session")
if term != ""
println(stream, "set term $term") println(stream, "set term $term")
end end
(output != "") && println(stream, "set output '$output'") (output != "") && println(stream, "set output '$output'")
if all # Dump datasets
for i in 1:length(gp.datas) for i in 1:length(gp.datas)
d = gp.datas[i] d = gp.datas[i]
println(stream, d.name * " << EOD") println(stream, d.name * " << EOD")
@ -555,7 +582,6 @@ function dump(gp::DrySession, stream; all=false, term::AbstractString="", output
end end
println(stream, "EOD") println(stream, "EOD")
end end
end
for i in 1:length(gp.plots) for i in 1:length(gp.plots)
d = gp.plots[i] d = gp.plots[i]
@ -569,11 +595,9 @@ function dump(gp::DrySession, stream; all=false, term::AbstractString="", output
end end
end end
(length(gp.plots) > 1) && println(stream, "unset multiplot") (length(gp.plots) > 1) && println(stream, "unset multiplot")
(output != "") && println(stream, "set output") println(stream, "set output")
if term != "" close(stream)
println(stream, "set term $former_term $former_opts") return nothing
end
return output
end end
@ -581,7 +605,7 @@ end
function driver(args...; flag3d=false) function driver(args...; flag3d=false)
if length(args) == 0 if length(args) == 0
gp = getsession() gp = getsession()
dump(gp) execall(gp)
return nothing return nothing
end end
@ -664,7 +688,7 @@ function driver(args...; flag3d=false)
elseif isa(arg, String) elseif isa(arg, String)
# Either a dataname, a plot or a command # Either a dataname, a plot or a command
if loop == 2 if loop == 2
if arg[1] == '$' if isa(arg, String) && (length(arg) > 1) && (arg[1] == '$')
dataname = arg[2:end] dataname = arg[2:end]
dataCompleted() dataCompleted()
elseif length(data) > 0 elseif length(data) > 0
@ -688,7 +712,7 @@ function driver(args...; flag3d=false)
dataplot = "" dataplot = ""
dataCompleted() dataCompleted()
(doDump) && (dump(gp)) (doDump) && (execall(gp))
return nothing return nothing
end end
@ -876,34 +900,6 @@ macro gsp(args...)
end end
# # --------------------------------------------------------------------
# """
# # repl
#
# Read/evaluate/print/loop
# """
# function repl(sid::Symbol)
# verb = options.verbose
# options.verbose = 0
# gp = getsession(sid)
# while true
# line = readline(stdin)
# (line == "") && break
# answer = send(gp, line, true)
# for line in answer
# println(line)
# end
# end
# options.verbose = verb
# return nothing
# end
# function repl()
# global options
# return repl(options.default)
# end
# ╭───────────────────────────────────────────────────────────────────╮ # ╭───────────────────────────────────────────────────────────────────╮
# │ FUNCTIONS MEANT TO BE INVOKED BY USERS │ # │ FUNCTIONS MEANT TO BE INVOKED BY USERS │
# ╰───────────────────────────────────────────────────────────────────╯ # ╰───────────────────────────────────────────────────────────────────╯
@ -947,11 +943,16 @@ exec("print GPVAL_TERM")
exec("plot sin(x)") exec("plot sin(x)")
``` ```
""" """
function exec(gp::DrySession, command::String) exec(gp::DrySession, command::String) = nothing
function exec(gp::GPSession, command::String)
answer = Vector{String}() answer = Vector{String}()
push!(answer, writeread(gp, command)...) push!(answer, writeread(gp, command)...)
verbose = options.verbose
options.verbose = false
errno = writeread(gp, "print GPVAL_ERRNO")[1] errno = writeread(gp, "print GPVAL_ERRNO")[1]
options.verbose = verbose
if errno != "0" if errno != "0"
printstyled(color=:red, "GNUPLOT ERROR $(gp.sid) -> ERRNO=$errno\n") printstyled(color=:red, "GNUPLOT ERROR $(gp.sid) -> ERRNO=$errno\n")
errmsg = writeread(gp, "print GPVAL_ERRMSG") errmsg = writeread(gp, "print GPVAL_ERRMSG")
@ -994,15 +995,14 @@ Save the data and commands in the current session to either:
To save the data and command from a specific session pass the ID as first argument, i.e.: To save the data and command from a specific session pass the ID as first argument, i.e.:
- `save(sid::Symbol, term="", output="")`; - `save(sid::Symbol, term="", output="")`;
- `save(sid::Symbol, stream::IO; term="", output="")`;
- `save(sid::Symbol, file::AbstractStrings; term="", output="")`. - `save(sid::Symbol, file::AbstractStrings; term="", output="")`.
In all cases the `term` keyword allows to specify a gnuplot terminal, and the `output` keyword allows to specify an output file. In all cases the `term` keyword allows to specify a gnuplot terminal, and the `output` keyword allows to specify an output file.
""" """
save( stream::IO ; kw...) = dump(getsession() , stream; all=true, kw...) save( ; kw...) = execall(getsession() ; kw...)
save(sid::Symbol, stream::IO ; kw...) = dump(getsession(sid), stream; all=true, kw...) save(sid::Symbol; kw...) = execall(getsession(sid); kw...)
save( file::AbstractString; kw...) = open(file, "w") do stream; dump(getsession() , stream; all=true, kw...); end save( file::AbstractString; kw...) = savescript(getsession() , file, kw...)
save(sid::Symbol, file::AbstractString; kw...) = open(file, "w") do stream; dump(getsession(sid), stream; all=true, kw...); end save(sid::Symbol, file::AbstractString; kw...) = savescript(getsession(sid), file, kw...)
# ╭───────────────────────────────────────────────────────────────────╮ # ╭───────────────────────────────────────────────────────────────────╮
@ -1029,6 +1029,36 @@ function palette(cmap::ColorScheme)
return "set palette defined (" * join(levels, ", ") * ")\nset palette maxcol $(length(cmap.colors))\n" return "set palette defined (" * join(levels, ", ") * ")\nset palette maxcol $(length(cmap.colors))\n"
end end
# ╭───────────────────────────────────────────────────────────────────╮
# │ EXPERIMENTAL FUNCTIONS │
# ╰───────────────────────────────────────────────────────────────────╯
# # --------------------------------------------------------------------
# """
# # repl
#
# Read/evaluate/print/loop
# """
# function repl(sid::Symbol)
# verb = options.verbose
# options.verbose = 0
# gp = getsession(sid)
# while true
# line = readline(stdin)
# (line == "") && break
# answer = send(gp, line, true)
# for line in answer
# println(line)
# end
# end
# options.verbose = verb
# return nothing
# end
# function repl()
# global options
# return repl(options.default)
# end
# -------------------------------------------------------------------- # --------------------------------------------------------------------
#= #=
Example: Example: