Am 25.01.2014 01:07, schrieb Hans Hagen: > On 1/24/2014 7:41 PM, Peter Rolf wrote: >> Am 24.01.2014 14:45, schrieb Hans Hagen: >>> On 1/24/2014 1:35 PM, Peter Rolf wrote: >>>> Hi, >>>> >>>> I try to create a Metapost path in lua and it works so far for the >>>> attached example. But a call of that function from another lua function >>>> sadly fails (no path visible after call). The code seems to be executed >>>> later (the output from 'show pid;' appears somewhere later in the log). >>>> >>>> How can I ensure that the code is executed at runtime? >>> >>> I don't understand the issue but isn't there a >>> >>> metafun("draw p;") >>> >>> missing then? >>> >> Setting the bounding box has the same effect, as drawing something. >> Both methods avoid that the emtpy graphic is ignored by ConTeXt. >> >> Anyhow, the MP path is not available in metapost.variables after the >> function call. If there is no other way I have to call the function from >> the TeX side (like in the attached example). Will look into that >> tomorrow. > > %D We also provide an outputless run: > > \unexpanded\def\startMPcalculation > I tried that command, but couldn't get it to work on the lua side.
The first pure MP line after context.startMPcalculation() raises a lua error and a combination with metafun() is also not working. So how to use this in lua? Anyhow, the problem is the execution time of the MP graphic. I changed the attached example a bit, so that you can see it. The inspect() in drops.foo() gives an empty table, while the second inspect on the TeX side shows the path "drops:foo". I need the path right after the call (it needs to be adapted to IM afterwards; mainly scaling and shifting). Is there a way to "force" the execution of the graphic without switching back to the TeX side? Peter
thirddata = thirddata or { } thirddata.drops = thirddata.drops or { } local drops = thirddata.drops local metafun = context.metafun local format,todimen = string.format, string.todimen local floor = math.floor -- http://lua-users.org/wiki/SimpleRound local function round(num, idp) local mult = 10^(idp or 0) return floor(num * mult + 0.5) / mult end function drops.numberofpixels(n,idp) local dimenfactor = 1/tex.pdfpxdimen return round(todimen(n)*dimenfactor,idp) end local numberofpixels = drops.numberofpixels function drops.generate_default_path(id,width,height,radius) local w,h,r w = numberofpixels(width); h = numberofpixels(height); r = numberofpixels(radius) metafun.start() metafun("save p,pid; path p; string pid;") -- metafun("id := \"drops:boxshadow_w%sh%sr%s\";",w,h,r) metafun("pid := \"%s\";",id) --metafun("show pid;") -- ok metafun("p:= unitsquare xyscaled(%s,%s) smoothed %s;",w,h,r) metafun("passvariable(pid,p);") metafun("setbounds currentpicture to boundingbox(p);") -- 'activator'; void graphics are ignored metafun.stop() end function drops.foo(id,width,height,radius) drops.generate_default_path(id,width,height,radius) inspect(metapost.variables) -- empty here end
\ctxloadluafile{mplua}{} \starttext \ctxlua{metapost.showlog = true} %\ctxlua{thirddata.drops.generate_default_path("drops:boxshadow-w199h100r10","200pt","100pt","10pt")} %\ctxlua{inspect(metapost.variables)} \ctxlua{thirddata.drops.foo("drops:foo","200pt","100pt","10pt")} \ctxlua{inspect(metapost.variables)} % ok here \stoptext
___________________________________________________________________________________ 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://tex.aanhet.net archive : http://foundry.supelec.fr/projects/contextrev/ wiki : http://contextgarden.net ___________________________________________________________________________________