diff --git a/Project.toml b/Project.toml new file mode 100644 index 0000000000000000000000000000000000000000..90acdb4cdd0215a495950d7df8fccce021ca49b5 --- /dev/null +++ b/Project.toml @@ -0,0 +1,8 @@ +name = "JuliaTikz" +uuid = "9c98e656-dfbc-11ea-2f36-4b421b45bbac" +authors = ["Leif Andersson <leif.andersson@control.lth.se>"] +version = "0.1.0" + +[deps] +Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" + diff --git a/src/JuliaTikz.jl b/src/JuliaTikz.jl new file mode 100644 index 0000000000000000000000000000000000000000..e86cbd636ca063432d76e543f5ace3ac6b9f4cf6 --- /dev/null +++ b/src/JuliaTikz.jl @@ -0,0 +1,105 @@ +module JuliaTikzModule + +export printcsv, JuliaTikz; + +using ControlSystems # ControlSystems v0.5.4 +using Plots +using Printf + + +function sprintdatarow(r) + join(map(n -> @sprintf("%#11.5G", n), r),';') +end + +function sprintheader(r) + join(map(n -> @sprintf("%11s", n), r),';') +end + +function printcsv(csv::String, data::Array{Any}) + @warn """printcsv(csv::String, data::Array{Any}) is deprecated + Use printcsv(data::Array{Any}, csv="") instead"""; + printcsv(data,csv); +end + + +""" + printcsv(data::Array{Any}, csv="") + +Print the array `data` to a file suitable for inclusion in pgfplots. +The columns of `data` should have a string as first element, and Float64 +as the remaining elements. + +The default name of the file will be `<name>.csv`, where `<name>` is the value +of the global variable `name`, typically given by `JuliaTikz`. Another name may +be specified whith the second argument of `printcsv`. +""" +function printcsv(data::Array{Any}, csv="") + if cmp(csv,"") == 0 + global name; + csv = name *".csv"; + end; + open(csv, "w") do f + hh = Array{String}(data[1,:]); + dd = convert(Array{Float64,2},data[2:end,1:end]); + println(f, sprintheader(hh)); + map(r->println(f,sprintdatarow(r)),eachrow(dd)); + end +end + +#@deprecate printcsv(csv::String, data::Array{Any}) printcsv(data::Array{Any}, csv="") + +""" + JuliaTikz(tikzfile,delete=true) + +Extract and run the Julia part of a combined tikz/Julia file. + +The boundary between the two is the string + + \\endinput Julia <name> + +where `<name>` is the name that will be given to the Julia file +(with .jl appended), and also to a variable `name` in the program, +i.e. name = "<name>". + +The Julia file will be extracted to a temporary directory, which will be +deleted after the run unless the optional argument `delete` is false. +""" +function JuliaTikz(tikzfile,delete=true) + dir = mktempdir(); + filespec = ""; out=""; + if !delete + println("Opening " * tikzfile) + end; + open(tikzfile) do file + res = nothing; + while res === nothing + if eof(file) + error("\"\\endinput Julia \" not found"); + end; + line = readline(file); + res = match(r"(\s*\\endinput\s+Julia\s+)([[:alnum:]]+)", line); + end; + + name = res.captures[2]; + filespec = join([dir, name * ".jl"],"/"); + out = open(filespec,"w"); + if !delete + println("Writing " * filespec); + end; + firstline = "name = \"" * name * "\""; + println(out,firstline); + while !eof(file) + println(out,readline(file)); + end; + close(out); + end; + include(filespec); + + if delete + rm(dir,recursive=true); + else + return filespec; + end; +end; + +end; # end module