On 12/28/2017 6:36 PM, Jorge Manuel wrote:
When I need to draw datapoints from a external data file I’m using lua,
like this:
\starttext
\startluacode
Elemento = {}
x = {}
y ={}
z= {}
carga = {}
i=1
context("\\startMPcode”)
context("numeric u; u := 1.5cm;")
for line in io.lines("molecule.xyz <http://molecule.xyz>") do
local a, b, c, d, e = string.match(line,
'(%a+)%s*%s*(%S+)%s*%s*(%S+)%s*%s*(%S+)%s*%s*(%S+)')
Elemento[i]= a
x[i]= tonumber(b)
y[i]= tonumber(c)
z[i]= tonumber(d)
carga[i]= tonumber(e)
context("label(\"%s\", (%0.6f u, %0.6f u));", a, x[i],y[i])
i=i+1
end
context("\\stopMPcode”)
\stopluacode
\stoptext
*Is there a way to pass directly the external data to MetaPost without
using Lua?*
I know that I can use a similar function to gdata from graph.mp. I try
to reuse this piece of code, but not works.
\startMPcode
vardef Grdln_@#(expr f) =
save n_, s_; string s_;
s_ = readfrom f;
string @#[];
if s_<>EOF:
@#1 := loptok s_;
n_ = if @#1="%": 0 else: 1 fi;
forever:
@#[incr n_] := loptok s_;
exitif @#[n_]=" ";
endfor
@#1<>" "
else: false
fi
enddef;
Grdln_$("molecule.xyz <http://molecule.xyz>");
\stopMPcode
mp file handling is rather crippled so this is where lua is better
\starttext
\startluacode
MP.mycode = { }
local elements = { }
function MP.mycode.loadelements(filename)
elements = { }
for line in io.lines(filename) do
elements[#elements+1] = { string.match(line,
'(%S+)%s*(%S+)%s*(%S+)%s*(%S+)%s*(%S+)') }
end
end
function MP.mycode.nofelements()
mp.print(#elements)
end
function MP.mycode.getlabel(i)
mp.quoted(elements[i][1])
end
function MP.mycode.getoffset(i)
mp.pair(elements[i][2],elements[i][3])
end
\stopluacode
\startMPcode
lua.MP.mycode.loadelements("molecule.xyz") ;
for i=1 upto lua.MP.mycode.nofelements() :
label (lua.MP.mycode.getlabel(i),50 * lua.MP.mycode.getoffset(i)) ;
endfor ;
\stopMPcode
\startMPcode
def my_loadelements(expr name) =
lua.MP.mycode.loadelements(name) ;
enddef ;
vardef my_nofelements =
lua.MP.mycode.nofelements()
enddef ;
vardef my_label(expr i) =
lua.MP.mycode.getlabel(i)
enddef ;
vardef my_offset(expr i) =
lua.MP.mycode.getoffset(i)
enddef ;
my_loadelements("molecule.xyz") ;
for i=1 upto my_nofelements :
label (my_label(i),50 * my_offset(i)) ;
endfor ;
\stopMPcode
\stoptext
If you use that kind of code a lot you can hide the lua calls in macros
which makes it look like metapost does it all.
Hans
-----------------------------------------------------------------
Hans Hagen | PRAGMA ADE
Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the
Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://context.aanhet.net
archive : https://bitbucket.org/phg/context-mirror/commits/
wiki : http://contextgarden.net
___________________________________________________________________________________