diff options
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | src/PyX.jl | 114 | 
2 files changed, 77 insertions, 39 deletions
@@ -40,3 +40,5 @@ following functions have "pyx_" preprended to the function name:  Also check the TODO file. +For pipeGS (ghostscript file conversion) output, see: +http://www.ghostscript.com/doc/current/Devices.htm @@ -1,9 +1,51 @@  module PyX +####### Required and over-written  using PyCall -using LaTeXStrings +import PyCall: pycall +import Base: convert, ==, isequal, hash, writemime, getindex, setindex!, haskey, keys, show, mimewritable + +# LaTeXStrings is strongly recommended but not required + +####### Types +export PyxCanvas +# Wrapper around PyX PyxCanvas, supporting graphics I/O and pretty display +# Based on PyPlot's Figure type +type PyxCanvas +    o::PyObject +end + +PyObject(f::PyxCanvas) = f.o +convert(::Type{PyxCanvas}, o::PyObject) = PyxCanvas(o) +==(f::PyxCanvas, g::PyxCanvas) = f.o == g.o +==(f::PyxCanvas, g::PyObject) = f.o == g +==(f::PyObject, g::PyxCanvas) = f == g.o +hash(f::PyxCanvas) = hash(f.o) +pycall(f::PyxCanvas, args...; kws...) = pycall(f.o, args...; kws...) +Base.call(f::PyxCanvas, args...; kws...) = pycall(f.o, PyAny, args...; kws...) +Base.Docs.doc(f::PyxCanvas) = Base.Docs.doc(f.o) +getindex(f::PyxCanvas, x) = getindex(f.o, x) +setindex!(f::PyxCanvas, v, x) = setindex!(f.o, v, x) +haskey(f::PyxCanvas, x) = haskey(f.o, x) +keys(f::PyxCanvas) = keys(f.o) + +mimewritable(::MIME"application/eps", c::PyxCanvas) = !isempty(c.o[:items]) +mimewritable(::MIME"image/eps", c::PyxCanvas) = !isempty(c.o[:items]) +mimewritable(::MIME"application/pdf", c::PyxCanvas) = !isempty(c.o[:items]) +mimewritable(::MIME"application/postscript", c::PyxCanvas) = !isempty(c.o[:items]) +mimewritable(::MIME"image/png", c::PyxCanvas) = !isempty(c.o[:items]) +mimewritable(::MIME"image/jpeg", c::PyxCanvas) = !isempty(c.o[:items]) + +writemime(io::IO, ::MIME"application/pdf", c::PyxCanvas) = writePDFfile(c, io) +writemime(io::IO, ::MIME"application/eps", c::PyxCanvas) = writeEPSfile(c, io) +writemime(io::IO, ::MIME"image/eps", c::PyxCanvas) = writeEPSfile(c, io) +writemime(io::IO, ::MIME"application/postscript", c::PyxCanvas) = writePSfile(c, io) +writemime(io::IO, ::MIME"image/png", c::PyxCanvas) = writeGSfile(c, io, "png16m") +writemime(io::IO, ::MIME"image/jpeg", c::PyxCanvas) = writeGSfile(c, io, "jpeg") + +####### Exports  export canvas, path, deco, deco_stroked, deco_filled  export connector, text, text_halign, text_valign, box  export style, style_linewidth, style_linestyle, style_linejoin, style_linecap @@ -12,10 +54,11 @@ export graph, graph_axis, graph_axis_painter, graph_data, graph_style, graph_sty  export graph_graphxyz, graph_data_function  export epsfile, deformer, trafo, attr, metapost_path  export plot, stroke -export writeEPSfile, writePDFfile +export writeEPSfile, writePDFfile, writeGSfile, pipeGS  export pyx_fill, pyx_append, pyx_insert, pyx_text  # See also Python3 section at end +####### Create virtual (pywrap) Julia modules for PyX python sub-modules  canvas = pywrap(pyimport("pyx.canvas"))  path = pywrap(pyimport("pyx.path"))  deco = pywrap(pyimport("pyx.deco")) @@ -51,50 +94,43 @@ trafo = pywrap(pyimport("pyx.trafo"))  attr = pywrap(pyimport("pyx.attr"))  metapost_path = pywrap(pyimport("pyx.metapost.path")) -function plot(g::PyObject, args...; kwargs...) -    # g should be Graph object -    return g[:plot](args...; kwargs...) -end - -function stroke(c::PyObject, args...; kwargs...) -    # c should be Canvas object -    return c[:stroke](args...; kwargs...) -end - -function pyx_fill(c::PyObject, args...; kwargs...) -    # c should be Canvas object -    return c[:fill](args...; kwargs...) -end - -function pyx_text(c::PyObject, args...; kwargs...) -    # c should be Canvas object -    return c[:text](args...; kwargs...) -end +####### Wrapper Functions +plot(g::PyObject, a...; k...) = g[:plot](a...; k...) +plot(g::PyxCanvas, a...; k...) = g[:plot](a...; k...) +stroke(c::PyxCanvas, a...; k...) = c[:stroke](a...; k...) +pyx_fill(c::PyxCanvas, a...; k...) = c[:fill](a...; k...) +pyx_text(c::PyxCanvas, a...; k...) = c[:text](a...; k...) +pyx_insert(c::PyxCanvas, a...; k...) = c[:insert](a...; k...) -function pyx_append(p::PyObject, args...; kwargs...) -    # p should be Path object -    return p[:append](args...; kwargs...) -end +# p should be Path object +pyx_append(p::PyObject, a...; k...) = p[:append](a...; k...) -function pyx_insert(c::PyObject, args...; kwargs...) -    # c should be Canvas object -    return c[:insert](args...; kwargs...) -end +writeEPSfile(g::PyObject, a...; k...) = g[:writeEPSfile](a...; k...) +writeEPSfile(c::PyxCanvas, a...; k...) = c[:writeEPSfile](a...; k...) +writePDFfile(g::PyObject, a...; k...) = g[:writePDFfile](a...; k...) +writePDFfile(c::PyxCanvas, a...; k...) = c[:writePDFfile](a...; k...) +writeGSfile(g::PyObject, a...; k...) = g[:writeGSfile](a...; k...) +writeGSfile(c::PyxCanvas, a...; k...) = c[:writeGSfile](a...; k...) -function writeEPSfile(g::PyObject, args...; kwargs...) -    return g[:writeEPSfile](args...; kwargs...) +# Some newer features only in recent (Python3) versions of PyX +if PyCall.pyversion > v"3" +    export writeSVGfile +    writeSVGfile(g::PyObject, a...; k...) = g[:writeSVGfile](a...; k...) +    writeSVGfile(c::PyxCanvas, a...; k...) = c[:writeSVGfile](a...; k...) +    mimewritable(::MIME"image/svg+xml", c::PyxCanvas) = !isempty(c.o[:items]) +    writemime(io::IO, ::MIME"image/svg+xml", c::PyxCanvas) = writeSVGfile(c, io)  end -function writePDFfile(g::PyObject, args...; kwargs...) -    return g[:writePDFfile](args...; kwargs...) +##### Actual Meaty Functions +function __init__() +    pytype_mapping(canvas.canvas, PyxCanvas)  end -# Some newer features only in recent (Python3) versions of PyX -if PyCall.pyversion > v"3" -    export writeSVGfile -    function writeSVGfile(g::PyObject, args...; kwargs...) -        return g[:writeSVGfile](args...; kwargs...) -    end +function pipeGS(g::PyxCanvas, args...; device="png16m", kwargs...) +    f = g[:pipeGS](args...; device=device, kwargs...) +    d = f[:read]() +    f[:close]() +    return d  end  end # module PyX  | 
