Dear Hans, I wrote to you > thank you for your latest effort to put u3d support in a working state, but more thanks for more effort, but > May be a more robust way is to read first 3 bytes of the model file, since > "U3D" or "PRC" signature is always there - that can be done instead of > relying on file name extension or only in case it it not "u3d" or "prc". you have implemented reading the file signature, but it is now almost useless, since if a file has extension other but U3D or PRC 3D annotation code will not be called by file inclusion mechanism and "io.readdata" routine is called local subtype, subdata = "U3D", io.readdata(foundname) or "" - what's that? One more point - preview bitmap images in 3D annotations are now disabled since necessary functionality of measuring XForms is missing - please, consider the following workaround. --- lpdf-u3d.lua.org 2010-03-26 18:24:44.000000000 +0300 +++ lpdf-u3d.lua 2010-04-14 14:24:28.000000000 +0400 @@ -17,6 +17,7 @@ local cos, sin, sqrt, pi, atan2, abs = math.cos, math.sin, math.sqrt, math.pi, math.atan2, math.abs local pdfconstant = lpdf.constant +local pdfnumber = lpdf.number local pdfboolean = lpdf.boolean local pdfunicode = lpdf.unicode local pdfdictionary = lpdf.dictionary @@ -62,8 +63,7 @@ local function make3dview(view) - local name = viewname - local name = pdfunicode((view.name ~= "" and name) or "unknown view") + local name = pdfunicode((view.name ~= "" and view.name) or "unknown view") local viewdict = pdfdictionary { Type = pdfconstant("3DView"), @@ -311,9 +311,6 @@ for i=1,#nodes do local node = checkedkey(nodes,i,"table") if node then - local position = checkedkey(node,"position","table") - position = position and #position == 12 and pdfarray(position) - if position then nodelist[#nodelist+1] = pdfdictionary { Type = pdfconstant("3DNode"), N = node.name or ("node_" .. i), -- pdfunicode ? @@ -325,13 +322,18 @@ }, M = position, } + local position = checkedkey(node,"position","table") + position = position and #position == 12 and pdfarray(position) + if position then + nodelist[#nodelist].M = position end end end - viewdict.NR = true viewdict.NA = nodelist end + viewdict.NR = true + return viewdict end @@ -349,19 +351,19 @@ local activationdict = pdfdictionary { TB = pdfboolean(param.toolbar,true), - NP = pdfboolean(param.tree,true), + NP = pdfboolean(param.tree,false), } local stream = streams[label] if not stream then - local subtype, subdata = "U3D", io.readdata(foundname) or "" + local subtype, subdata = "U3D", file.readdata(foundname) or "" if find(subdata,"^PRC") then - subtype == "PRC" + subtype = "PRC" elseif find(subdata,"^U3D") then - subtype == "U3D" + subtype = "U3D" elseif file.extname(foundname) == "prc" then - subtype == "PRC" + subtype = "PRC" end local attr = pdfdictionary { @@ -423,12 +425,35 @@ local ref = stored_pr[tag] if not ref then -- weird, has to be a /Form and not an /Image so we need a wrap = true key - -- local figure = img.immediatewrite { filename = preview, width = width, height = height } - local figure = img.immediatewrite { stream = ".5 .75 .75 rg 0 0 20 10 re f", bbox = {0,0,20,10 } } + local figure = img.immediatewrite { filename = preview, width = width, height = height } + -- local figure = img.immediatewrite { stream = ".5 .75 .75 rg 0 0 20 10 re f", bbox = {0,0,20,10 } } ref = figure.objnum stored_pr[tag] = ref end - annot.AP = ref and pdfdictionary { N = pdfreference(ref) } + if ref then + local pw = pdfdictionary { + Type = pdfconstant("XObject"), + Subtype = pdfconstant("Form"), + FormType = pdfnumber(1), + BBox = pdfarray { pdfnumber(0), pdfnumber(0), pdfnumber(factor*width), pdfnumber(factor*height) }, + Matrix = pdfarray { pdfnumber(1), pdfnumber(0), pdfnumber(0), pdfnumber(1), pdfnumber(0), pdfnumber(0) }, + Resources = pdfdictionary { + XObject = pdfdictionary { + IM = pdfreference(ref) + } + }, + ExtGState = pdfdictionary { + GS = pdfdictionary { + Type = pdfconstant("ExtGState"), + CA = pdfnumber(1), + ca = pdfnumber(1) + } + }, + ProcSet = pdfarray { pdfconstant("PDF"), pdfconstant("ImageC") }, + } + local pwd = pdf.immediateobj("stream",format("q /GS gs %s 0 0 %s 0 0 cm /IM Do Q",factor*width,factor*height),pw()) + annot.AP = pdfdictionary { N = pdfreference(pwd) } + end return annot, figure, ref else activationdict.A = pdfconstant("PV") Also I try to remind you AGAIN and AGAIN about pdfboolean problem in lpdf-ini.lua (old code is not OK if b is "false" and default is "true") local function pdfboolean(b,default) - if ((type(b) == "boolean") and b) or default then - return p_true + if type(b) ~= "boolean" then + if default then + return p_true + else + return p_false + end else - return p_false + if b then + return p_true + else + return p_false + end end end Sincerely, Michail PS. And a great palliative way to deal with 3D annotations is via attaching a 3D PDF file made with LaTeX (by Asymptote, for example). But while your method of answering my messages in lua works OK for new code (updating minimals and making a diff with old code is not harder than checking e-mail inbox - "Your morning patch, sir!" ;), I can not deduce from existing sea of ConTeXt code the status of file attachments support.