Thanks a lot for this nice and clean solution. It’s fantastic. Now it is very easy to make scatter plots from the output of c++ libraries and other kind of applications: two axes and a path build like this

 path curve; 
 numeric i; i:=1;
 curve :=  my_offset(i) forever: hide(i := i + 1) exitif i >  my_nofelements .. my_offset(i) endfor;

Thanks again

Have a great 2018

Jorge


No dia 28/12/2017, às 18:47, Hans Hagen <pragma@wxs.nl> escreveu:

\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