This commit is contained in:
Giorgio Calderone 2019-05-03 11:22:49 +02:00
parent 5d6169b993
commit c198cf549e

View File

@ -1075,7 +1075,7 @@ function hist(v::Vector{T}; range=[NaN,NaN], bs=NaN, nbins=0, pad=true) where T
end end
function contourlines(args...; cntrparam="level auto 10", lw=0, offset=0, minlen=10) function contourlines(args...; cntrparam="level auto 10", offset=0, width=0.)
tmpfile = Base.Filesystem.tempname() tmpfile = Base.Filesystem.tempname()
sid = Symbol("j", Base.Libc.getpid()) sid = Symbol("j", Base.Libc.getpid())
if !haskey(state.sessions, sid) if !haskey(state.sessions, sid)
@ -1090,57 +1090,64 @@ function contourlines(args...; cntrparam="level auto 10", lw=0, offset=0, minlen
Gnuplot.exec(sid, "unset table") Gnuplot.exec(sid, "unset table")
Gnuplot.exec(sid, "reset") Gnuplot.exec(sid, "reset")
dump = false
outl = Vector{String}() outl = Vector{String}()
outc = Vector{String}() outc = Vector{String}()
curx = Vector{Float64}() curx = Vector{Float64}()
cury = Vector{Float64}() cury = Vector{Float64}()
curl = "" curl = ""
elength(x, y) = sqrt.((x[2:end] .- x[1:end-1]).^2 .+
for l in readlines(tmpfile) (y[2:end] .- y[1:end-1]).^2)
if length(strip(l)) == 0 function dump()
dump = true if (length(curx) < 2) || (curl == "")
continue return nothing
end end
if !isnothing(findfirst("# Contour ", l)) if sum(elength(curx, cury)) > width
curl = strip(split(l, ':')[2]) if (offset > 0) && (offset+3 < length(curx))
dump = true append!(outc, string.(curx[1:offset]) .* " " .* string.(cury[1:offset]))
continue push!(outc, "")
curx = [curx[offset+1:end]; curx[1]]
cury = [cury[offset+1:end]; cury[1]]
end end
(l[1] == '#') && continue if length(curx) > 3
d = cumsum(elength(curx, cury))
if dump && (length(curx) > 1) && (curl != "") i0 = findall(d .<= width); sort!(i0)
if offset != 0 i1 = findall(d .> width)
curx = circshift(curx, offset) n = 1
cury = circshift(cury, offset) rot1 = atan(cury[i0[end]]-cury[i0[1]], curx[i0[end]]-curx[i0[1]]) * 180 / pi
rot = round(mod(rot1, 360))
x = mean(curx[i0])
y = mean(cury[i0])
push!(outl, "set label " * string(length(outl)+1) * " '$curl' at $x, $y center front rotate by $rot")
curx = curx[i1]
cury = cury[i1]
end end
if (lw > 0) && (length(curx) > (2*lw+2 + minlen))
n = lw + 1
x = curx[n]
y = cury[n]
rot = atan(cury[n+1]-cury[n-1], curx[n+1]-curx[n-1]) * 180 / pi
rot = round(mod(rot, 360))
push!(outl, "set label " * string(length(outl)+1) * " '$curl' at $x, $y centre front rotate by $rot")
curx = curx[2*lw+2:end]
cury = cury[2*lw+2:end]
end end
append!(outc, string.(curx) .* " " .* string.(cury)) append!(outc, string.(curx) .* " " .* string.(cury))
push!(outc, "") push!(outc, "")
empty!(curx) empty!(curx)
empty!(cury) empty!(cury)
dump = false
end end
for l in readlines(tmpfile)
if length(strip(l)) == 0
dump()
continue
end
if !isnothing(findfirst("# Contour ", l))
dump()
curl = strip(split(l, ':')[2])
continue
end
(l[1] == '#') && continue
n = Meta.parse.(split(l)) n = Meta.parse.(split(l))
@assert length(n) == 3 @assert length(n) == 3
push!(curx, n[1]) push!(curx, n[1])
push!(cury, n[2]) push!(cury, n[2])
end end
rm(tmpfile) rm(tmpfile)
if lw > 0 (width > 0.) && (return (outl, outc))
return (outl, outc)
end
return outc return outc
end end